Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建从用户数组返回JSON的@Restcontroller_Java_Spring - Fatal编程技术网

Java 如何创建从用户数组返回JSON的@Restcontroller

Java 如何创建从用户数组返回JSON的@Restcontroller,java,spring,Java,Spring,一段时间以来,我一直在努力解决这个挑战。我是一名JavaScript开发人员,但一直在试用SpringBoot和Java,遇到了一个问题。在下面的代码中,我需要弄清楚如何编写@RestController逻辑,从下面在User类中创建的用户列表中返回JSON。我不知道该怎么做,因为这对我来说都是新鲜事 package usersExample; import org.springframework.web.bind.annotation.RestController; import org.s

一段时间以来,我一直在努力解决这个挑战。我是一名JavaScript开发人员,但一直在试用SpringBoot和Java,遇到了一个问题。在下面的代码中,我需要弄清楚如何编写
@RestController
逻辑,从下面在User类中创建的用户列表中返回JSON。我不知道该怎么做,因为这对我来说都是新鲜事

package usersExample;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

@RestController
public class UsersController {
    /* Please insert your code here to make the tests pass */
}

@Service
class UserService {
    public List<User> all() {
        List<User> users = new ArrayList<User>();
        users.add(new User("Bob"));
        users.add(new User("Christina"));
        users.add(new User("Steve"));
        return users;
    }
}

class User {
  private final String name;
  public User(String name) {
      this.name = name;
  }
  public String getName() {
      return name;
  }
}
package用户示例;
导入org.springframework.web.bind.annotation.RestController;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.ResponseBody;
导入org.springframework.stereotype.Service;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.AtomicLong;
@RestController
公共类用户控制器{
/*请在此处插入代码以使测试通过*/
}
@服务
类用户服务{
公共列表全部(){
列表用户=新建ArrayList();
添加(新用户(“Bob”);
添加(新用户(“克里斯蒂娜”);
添加(新用户(“Steve”);
返回用户;
}
}
类用户{
私有最终字符串名;
公共用户(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
}

因为您使用的是
@RestController
,所以返回值已经是JSON(spring boot进行转换时不添加其他依赖项,因为它已经包含Jackson库)。 您只需在控制器中创建一个方法,该方法将返回用户的
列表。关于代码的一点意见是:使用适当的方法名,如
findAll()
,而不是
all()

转换器将查找以
get
关键字开头的方法,并将其后的所有内容设置为属性名称,第一个字母转换为小写,这意味着唯一的属性(因为您只有一个getter)将如下所示:
name:-此处的值-

现在您可能会问一些问题,如:

(一)

Q:如果将
getName()
方法更改为
getName()
,会发生什么情况

A:也会起同样的作用

(二)

Q:如果不为字段提供getter,会发生什么

A:该字段不会转换为JSON属性

(三)

Q:如果将
getName()
方法更改为
getMyName()
,会发生什么情况

A:属性名称将是
myName:-value-

因此,如果已经说过,如果您想更改JSON结构,有很多解决方案:

1) 更改getter名称(不推荐)

2) 使用@JsonProperty注释。例如:

private String name;

@JsonProperty("name")
public String thismethodwontworkwithoutjsonproperty() {
    return this.name;
}
3) 创建一个DTO对象
UserDTO
,并返回该对象,而不是
User
。在控制器中,您可以将用户转换为userDTO对象

public class UserDTO {
   private String fullName; 
   //getter; setter;
}

最后,你可以这样进行转换:

@GetMapping("/getUser")
public User returnUser() {
    User user = new User();
    user.setFirstName("Stack");
    user.setLastName("Overflow");
    UserDto userDto = convertUser(user);
    return userDto;
}

private UserDTO convertUser(User user) {
    UserDTO userDTO = new UserDTO();
    userDTO.setFullName(user.getFirstName() + " " + user.getLastName());
    return userDTO;
}
但是我建议您构造应用程序并添加一个
facade
层,该层将进行此转换,而不是在控制器中创建
convertUser()
方法

输出:

{
  "fullName":"Stack Overflow";
}

令人惊叹的。谢谢。我一定会记住的。目前,这就是我被指示编写程序的方式。然而,你编写的代码并不能帮助我解决手头的问题。我似乎仍然无法以所需的格式返回数据。我已经提供了有关您问题的更多详细信息。。也许它会帮助你实现你所需要的,并理解这个
springboot
是如何工作的。非常感谢你。这确实帮助我更好地理解了逻辑。我真的很感激。我很高兴能帮上忙。你期望的输出格式是什么?
public class User {
  private String firstName;
  private String lastName;
  //getter;setter;
}
@GetMapping("/getUser")
public User returnUser() {
    User user = new User();
    user.setFirstName("Stack");
    user.setLastName("Overflow");
    UserDto userDto = convertUser(user);
    return userDto;
}

private UserDTO convertUser(User user) {
    UserDTO userDTO = new UserDTO();
    userDTO.setFullName(user.getFirstName() + " " + user.getLastName());
    return userDTO;
}
{
  "fullName":"Stack Overflow";
}