我使用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类,那么它可能有意义 你怎么看待这件事?还有其他更好的方法吗?
我希望这不是基于意见的问题,我不希望它成为。我只是不想使用反模式并且有良好的做法来开始:)
答案 0 :(得分:8)
返回ResponseEntity
作为@ M-deinum写的绝对是要走的路。此外,您可以使用适当的@ControllerAdvice
注释来注释异常类,而不是在@ResponseStatus
中为每个异常定义行为。
@ResponseStatus(HttpStatus.BAD_REQUEST)
class SomeException extends RuntimeException {
}