【问题标题】:REST API Response.ok(entity).build() doesn't show textREST API Response.ok(entity).build() 不显示文本
【发布时间】:2020-09-11 09:05:13
【问题描述】:

我正在为学校练习创建一个简单的 Restful API,但遇到了问题。当我尝试在网页上显示实体列表或仅显示单个实体时,它不显示任何文本。它似乎确实找到了正确的实体(当我过滤时,它显示了正确的实体数量),它只是不显示文本。也许它不运行 ToString?但我的 ToString 方法没有发现任何问题。

这是一个例子:

在我的 UserResources 中返回用户的函数:

@GET //GET at http://localhost:XXXX/users/1
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getUserPath(@PathParam("id") int Id) {
        User user = fakeDatabase.getUser(Id);
        if (user == null) {
            return Response.status(Response.Status.BAD_REQUEST).entity("Please provide a valid user ID.").build();
        } else {
            return Response.ok(user).build();
        }
    }

在 FakeDatabase 中获取用户:

public User getUser(int userId) {
        for (User user : userList) {
            if (user.GetUserId() == userId) {
                return user;
            }
        }
        return null;
    }

用户ToString:

@Override
    public String toString() {
        String WishlistItems = "";
        for(String item : Wishlist){
            WishlistItems = WishlistItems + item + ", ";
        }

        return "User (" + UserId + ") {" + "\n" +
                "Email Address = " + EmailAddress + "\n" +
                "UserName = " + UserName + "\n" +
                Platform.toString() + " ID = " + PlatformID + "\n" +
                "Wishlist :" + WishlistItems + "\n" +
                "}" + "\n";
    }

我在网站上得到的结果:

有人知道这个问题的解决方案吗?

编辑:完整的用户类(我也更新了 toString 方法):

@XmlRootElement
public class User {
    private int UserId;
    private String UserName;
    private String EmailAddress;
    private int PasswordHash;
    private Platform Platform;
    private String PlatformID;
    private ArrayList<String> Wishlist = new ArrayList<String>();

    public User(int userId, String Password, String emailAddress, String userName, Platform platform, String platformID){
        UserId = userId;
        EmailAddress = emailAddress;
        UserName = userName;
        Platform = platform;
        PlatformID = platformID;
        hashPassword(Password);
    }

    public User(){

    }

    public int GetUserId(){
        return UserId;
    }

    public String GetUserName(){
        return UserName;
    }

    public void SetUserName(String UserName){
        this.UserName = UserName;
    }

    public String GetEmailAddress(){
        return EmailAddress;
    }

    public void SetEmailAddress(String EmailAddress){
        this.EmailAddress = EmailAddress;
    }

    public Platform GetPlatform(){
        return Platform;
    }

    public void SetPlatform(Platform Platform){
        this.Platform = Platform;
    }

    public String GetPlatformID(){
        return PlatformID;
    }

    public void SetPlatformID(String PlatformID){
        this.PlatformID = PlatformID;
    }

    public void AddToWishlist(String item){
        Wishlist.add(item);
    }

    public ArrayList<String> GetWishlist(){
        return Wishlist;
    }

    public void SetWishlist(ArrayList<String> Wishlist){
        this.Wishlist = Wishlist;
    }

    public void hashPassword(String Password) {
        PasswordHash = Objects.hash(Password);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return UserId == user.GetUserId();
    }

    @Override
    public String toString() {
        String WishlistItems = "";
        for(String item : Wishlist){
            WishlistItems = WishlistItems + item + ", ";
        }

        return "User (" + UserId + ") {" + "\n" +
                "Email Address = " + EmailAddress + "\n" +
                "UserName = " + UserName + "\n" +
                Platform.toString() + " ID = " + PlatformID + "\n" +
                "Wishlist :" + WishlistItems + "\n" +
                "}" + "\n";
    }
}

【问题讨论】:

  • 你也可以在这里粘贴用户类吗?
  • 问题似乎出在您的 getter setter 方法上。所有标准库都遵循 camelCase。由于您的 getter 和 setter 以大写字母开头,杰克逊无法序列化这些。使用 getUserId、getUserName、setUserId 等方法名称。
  • @Akash 哇!我永远不会想出更换外壳,我不知道它如此依赖它......谢谢!

标签: java spring-boot rest intellij-idea tostring


【解决方案1】:

响应实体未通过toString() mehtod 序列化。如果要返回字符串,则必须自己调用user.toString() 来设置字符串实体。
如果将对象设置为实体,它将被视为 POJO。这意味着您必须为您的属性定义适当的 setXXX/getXXX 方法。您的 User 类使用了错误的大小写。

查看Set a Response Body in JAX-RS 了解更多详细信息(特别是第 3.4 节。使用 POJO 的 JSON 响应可能对您感兴趣)

【讨论】:

  • 谢谢!永远不会想到它可以依赖camelCasing / PascalCasing ...
【解决方案2】:

您使用 Spring Boot 标记了您的问题,但 Spring Boot 代码看起来确实不同。试试这样的:

@GetMapping("/users/{id}")
public ResponseEntity<User> getUserPath(@PathVariable("id") int Id) {
    User user = fakeDatabase.getUser(Id);
    if (user == null) {
        return ResponseEntity.badRequest().body("Please provide a valid user ID.");
    } else {
        return ResponseEntity.ok(user);
    }
}

【讨论】:

    【解决方案3】:

    这是一个目的:

    @RestController
    @RequestMapping("/user")
    public class UserController {
        @GET //GET at http://localhost:XXXX/users/1
        @Path("/{id}")
        @Produces(MediaType.APPLICATION_XML)
        public Response<User> getUserPath(@PathParam("id") int Id) {
           return fakeDatabase.getUser(Id).ifPresentOrElse(u -> Response.ok(u), return Response.empty());
        }
    }
    
    public class FakeBase {
        public Optional<User> getUser(int userId) {
            return userList.stream().filter(u -> u.hasId(userId)).findFirst();
        }
    }
    
    public class User () {
        public boolean hasId(int id) {
            return this.id == id; 
        }
    }
    

    User.toString() 没用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多