return HttpStatus 代码 Spring REST 的更好方法

Better approach to return HttpStatus code Spring REST

我使用 spring 开发 rest 服务很长时间了,直到现在我对 return http 状态码的处理方式是这样的:

    @RequestMapping(value = "/sth")
    public void name(HttpServletResponse response){
        boolean lever = service.doSomethingAndReturnTrueIfSucceedOrFalseIfNot();
        if(lever){
            response.setStatus(HttpServletResponse.SC_OK);
        }else{
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST); //NOT_FOUND or whatever
        }
    }

但我相信有更好的方法来做到这一点。我知道我们有 @ResponseStatus 注释,但它是..静态的,我的意思是它 return 总是 相同的代码 -但如果出现问题怎么办?那么我不想例如将 200 OK 作为响应代码。

我找到了这样的解决方案:添加 @ResponseStatus 作为静态响应代码,但是当控制器出现问题时,然后 抛出一些自定义异常 并在新的 @ControllerAdvice class 中捕获它,并且还添加了 @ResponseStatus 注释和 return 适当的代码。

    @RequestMapping(value = "/sth")
    @ResponseStatus(HttpStatus.OK)
    public void name(HttpServletResponse response) throws Exception{
        boolean lever = service.doSomethingAndReturnTrueIfSucceedOrFalseIfNot();
        if(!lever){
            throw new SomethingWentWrongCustomException("Not okay..");
        }
    }

然后在 class 中捕捉它,例如:

@ControllerAdvice
public class SomethingControllerAdvice{
    @ExceptionHandler(value = SomethingWentWrongCustomException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void someName(){
    }
}

这似乎是一个非常优雅的解决方案,但代码非常..罗嗦,不是吗? 另一方面,如果我为整个应用程序采用它并创建@ControllerAdvice classes,那么它可能有意义 你怎么看待这件事?还有其他更好的方法吗?

我希望这不是基于意见的问题,我不希望它是。我只是不想使用反模式并从一开始就有好的做法:)

如@M-deinum 所写,返回 ResponseEntity 绝对是可行的方法。此外,无需为 @ControllerAdvice 中的每个异常定义行为,您只需使用适当的 @ResponseStatus 注释来注释您的异常 类。

@ResponseStatus(HttpStatus.BAD_REQUEST)
class SomeException extends RuntimeException {

}