使用spring boot构建rest api时,什么是处理来自服务级别的异常并将它们传递到控制器的最佳方法,因此客户端会收到自定义json错误消息< / strong>。
{
"message": "some error"
}
控制器的端点
@PostMapping("/login")
public String login(@RequestBody @Valid LoginDto loginDto) {
return gson.toJson(userService.login(loginDto.getUsername(), loginDto.getPassword()));
}
服务水平代码
public LoginResponseDto login(String username, String password) {
try {
//performs some checks
...
return new LoginResponseDto(token.get());
} catch (AuthenticationException e){
LOGGER.info("Log in failed for user {}", username);
}
return new LoginResponseDto("login failed");
}
LoginResponseDto类
String token;
String message;
public LoginResponseDto(String message) {
this.message = message;
}
当前它显然返回的是正确的消息,但不是正确的状态代码,它将在json中显示状态200和错误消息。
答案 0 :(得分:0)
您有一些选择:
1)返回一条消息:
如果您要返回这样的消息,
{
"message": "some error"
}
您可以做的是:
选项1:为错误消息创建一个自定义POJO类,并返回对该POJO类的对象的引用。
类似这样的东西:
ErrorMessage.java
package org.example;
public class ErrorMessage {
private String message;
public ErrorMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
控制器中的请求处理程序方法:
@GetMapping("/login{?username, password}")
public ErrorMessage isUserAuthenticated(@RequestParam String username, @RequestParam String password) {
if (username.toLowerCase().contentEquals("root") && password.contentEquals("system")) {
return new ErrorMessage("authenticated");
}
return null;
}
选项2:创建地图,然后在消息中插入想要的键值对。
赞:
@GetMapping("/login{?username, password}")
public Map<String, String> isUserAuthenticated(@RequestParam String username, @RequestParam String password) {
Map<String, String> message = new HashMap<>();
if (username.toLowerCase().contentEquals("root") && password.contentEquals("system")) {
message.put("message", "authenticated");
}
return message;
}
2)返回错误状态代码(我强烈建议):
您可以为此使用ResponseEntity。
@GetMapping("/login{?username, password}")
public ResponseEntity<?> isUserAuthenticated(@RequestParam String username, @RequestParam String password) {
if (username.toLowerCase().contentEquals("root") && password.contentEquals("system")) {
return new ResponseEntity<>(HttpStatus.OK);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}