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 {
}
我使用 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 {
}