更好的方法返回HttpStatus代码Spring REST

时间:2015-01-05 10:23:25

标签: java spring rest exception status

我使用spring开发了很长时间的休息服务,直到现在我返回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 注释,但它是..静态的,我的意思是它总是返回相同的代码 - 但如果出现问题怎么办?然后,我不想要例如200个OK作为响应代码。

我找到了这样的解决方案:将 @ResponseStatus 添加为静态响应代码,但是当控制器出现问题时,抛出一些自定义异常并将其捕获新的 @ControllerAdvice类,还添加@ResponseStatus注释并返回正确的代码。

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

然后在课堂上抓住它:

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

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

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

1 个答案:

答案 0 :(得分:8)

返回ResponseEntity作为@ M-deinum写的绝对是要走的路。此外,您可以使用适当的@ControllerAdvice注释来注释异常类,而不是在@ResponseStatus中为每个异常定义行为。

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

}