如何正确处理服务中的异常(Spring Boot Rest)

时间:2018-11-22 21:58:15

标签: spring-boot exception-handling

使用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和错误消息。

1 个答案:

答案 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);
}