如何在Java中向HTTP请求返回消息?

How to return a message to HTTP request in Java?

提问人:mdaabis 提问时间:1/21/2023 最后编辑:mdaabis 更新时间:1/25/2023 访问量:180

问:

我正在创建一个 API 来模拟自动售货机,我正在使用 Spring、JPA 和 MySQL。我有一个 POST 请求的端点,它允许通过在名为 .我检查了表中是否已经存在用户名,如果存在,我想返回一条消息,指出创建新用户不成功,因为该用户名已在使用中。如果用户名不在表中,我想返回该对象。usersUser

如何返回此错误消息?从我目前所发现的情况来看,建议包括使用 ResponseEntity 或创建自定义异常处理程序,对于我认为非常简单的事情来说,这些似乎都过于复杂。有没有更简单的方法可以做到这一点?

所以这就是我希望成功创建新用户时响应的样子(我目前已设法成功工作):

{
    "username": "user",
    "password": "password",
    "role": "BUYER",
    "deposit": 0.0,
    "id": 12
}

如果它失败了,我希望它返回一些类似于以下内容的内容:

Error: username already in use.

或:

{
  "error" : "Username already in use"
}

用户对象:

@Entity
@Table(name = "users")
public class User
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int userId;

    @NotNull
    @Column(name = "username", unique = true)
    private String username;

    @NotNull
    @Column(name = "password")
    private String password;

    @NotNull
    @Column(name = "role")
    private Role role;

    @NotNull
    @Column(name = "deposit")
    private BigDecimal deposit;

    public User() {}

    public User(String username, String password, Role role, BigDecimal deposit)
    {
        this.username = username;
        this.password = password;
        this.role = role;
        this.deposit = deposit;
    }

    public int getId()
    {
        return userId;
    }

    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    public Role getRole()
    {
        return role;
    }

    public void setRole(String role)
    {
        this.role = Role.valueOf(role);
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public BigDecimal getDeposit()
    {
        return deposit;
    }

    public void setDeposit(BigDecimal deposit)
    {
        this.deposit = deposit;
    }
}

正在调用的控制器中的方法:

    @PostMapping(value = "/create-user", consumes = {"application/json"})
    public User createUser(@RequestBody User user)
    {
        return userService.createUser(user);
    }

UserService 中的 createUser 方法:

    public User createUser(User user)
    {
//        if(userRepository.userExists(user.getUsername()) == 0)
        return userRepository.save(user);
    }

UserRepository是一个扩展 的接口。JpaRepository

如果我遗漏了一些信息或问题措辞不正确,请告诉我,我会相应地更新。

Java MySQL REST JPA 错误处理

评论

0赞 Turing85 1/21/2023
编辑帖子并分享(相关)代码。

答:

1赞 the_tech_maddy 1/21/2023 #1

这可以通过多种方式实现。

  1. 您可以使用 JpaRepository 或类似的“exists”方法。这将返回一个布尔值。如果为 true,即给定 ID 的条目已存在,则可以发送错误响应。否则,为新用户对象。为此,您可以有一个模型类,该类一次可以保存一个用户对象或一个错误字符串。使用 Jackson 库中的注释来显示/隐藏字段。阅读更多existsById()UserOrError@JsonView
  2. 根据上述“exists”方法的结果,用 包装。控制器方法的返回类型应为 。这是链接。这种方法的优点是可以发送不同的HTTP状态码ResponseEntity<T>ResponseEntity<T>
  3. 在服务层中抛出一个自定义,并使用 Spring 的异常处理,如注解RuntimeExceptionRestControllerAdvice

评论

0赞 mdaabis 1/24/2023
对于第一个选项,当您说该类将包含用户对象或错误字符串时,您的意思是该类将同时包含两者,但如果有错误消息,则用户对象将为 null?或者实际上有没有一种方法可以配置一个类,使其包含一种或另一种类型?
0赞 the_tech_maddy 1/24/2023
@mdaabis是的。两者的类是相同的。您可以使用 Jackson 库中的注释来根据场景显示/隐藏字段。(在答案中更新相同)@JsonView