提问人:mdaabis 提问时间:1/21/2023 最后编辑:mdaabis 更新时间:1/25/2023 访问量:180
如何在Java中向HTTP请求返回消息?
How to return a message to HTTP request in Java?
问:
我正在创建一个 API 来模拟自动售货机,我正在使用 Spring、JPA 和 MySQL。我有一个 POST 请求的端点,它允许通过在名为 .我检查了表中是否已经存在用户名,如果存在,我想返回一条消息,指出创建新用户不成功,因为该用户名已在使用中。如果用户名不在表中,我想返回该对象。users
User
如何返回此错误消息?从我目前所发现的情况来看,建议包括使用 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
如果我遗漏了一些信息或问题措辞不正确,请告诉我,我会相应地更新。
答:
1赞
the_tech_maddy
1/21/2023
#1
这可以通过多种方式实现。
- 您可以使用 JpaRepository 或类似的“exists”方法。这将返回一个布尔值。如果为 true,即给定 ID 的条目已存在,则可以发送错误响应。否则,为新用户对象。为此,您可以有一个模型类,该类一次可以保存一个用户对象或一个错误字符串。使用 Jackson 库中的注释来显示/隐藏字段。阅读更多
existsById()
UserOrError
@JsonView
- 根据上述“exists”方法的结果,用 包装。控制器方法的返回类型应为 。这是链接。这种方法的优点是可以发送不同的HTTP状态码
ResponseEntity<T>
ResponseEntity<T>
- 在服务层中抛出一个自定义,并使用 Spring 的异常处理,如注解
RuntimeException
RestControllerAdvice
评论
0赞
mdaabis
1/24/2023
对于第一个选项,当您说该类将包含用户对象或错误字符串时,您的意思是该类将同时包含两者,但如果有错误消息,则用户对象将为 null?或者实际上有没有一种方法可以配置一个类,使其包含一种或另一种类型?
0赞
the_tech_maddy
1/24/2023
@mdaabis是的。两者的类是相同的。您可以使用 Jackson 库中的注释来根据场景显示/隐藏字段。(在答案中更新相同)@JsonView
评论