Java 如何为@ResponseStatus创建分支结果
使用@ResponseStatus可以在Spring中设置Rest响应的状态。但是,如何将它用于来自同一请求的不同类型的状态呢Java 如何为@ResponseStatus创建分支结果,java,spring,Java,Spring,使用@ResponseStatus可以在Spring中设置Rest响应的状态。但是,如何将它用于来自同一请求的不同类型的状态呢 例如,控制器中有一种方法可以返回200或404。仅在一个方法中使用@ResponseStatus如何定义这些状态?您不能使用@ResponseStatus根据分支结果设置不同于一个方法的状态代码 您必须在方法中直接返回ResponseEntity或操作HttpServletResponse,或者在异常处理程序返回状态的错误情况下最终抛出异常我不确定这是否能回答您的问题,
例如,控制器中有一种方法可以返回200或404。仅在一个方法中使用@ResponseStatus如何定义这些状态?您不能使用@ResponseStatus根据分支结果设置不同于一个方法的状态代码
您必须在方法中直接返回ResponseEntity或操作HttpServletResponse,或者在异常处理程序返回状态的错误情况下最终抛出异常我不确定这是否能回答您的问题,但您可以抛出带有所需状态代码的ResponseStatusException。不过,在200中使用它会很奇怪。通常您不会在@ResponseStatus中使用它。相反,您可以使用ResponseEntity作为方法的返回类型。如果返回项目的“类型”可以更改,ResponseEntity或ResponseEntity也可以工作 例如:
@GetMapping("/{key}")
public ResponseEntity<Thing> getThing(final @PathVariable String key) {
final Thing theThing = this.thingService.get(key);
final ResponseEntity<?> response;
if (theThing.someProperty()) {
response = ResponseEntity.ok(theThing);
} else {
response = ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);
}
return response;
}
为了直接回答您的问题,@ResponseStatus不能通过单一方法发送不同的状态 如果您想使用@ResponseStatus,您如何处理多个状态是: 将控制器方法注释为@ResponseStatus,并带有所需的2xx HttpStatus。此状态将由成功场景中的控制器方法发送。通常,它用于设置HttpStatus,而不是像201这样的200,因为即使不使用@ResponseStatus,200也是默认发送状态。 使用@ExceptionHandler注释异常处理程序方法,以处理不同的异常场景,还使用@ResponseStatus注释相应的HttpStatus。例如,如果要处理未找到资源的场景,可以使用@ResponseStatusHttpStatus.not_found注释异常处理程序方法,以发回404。 如果不需要发送动态错误响应,您甚至可以使用@ResponseStatus和所需的HttpStatus标记自定义异常类,并且当抛出异常而未显式捕获和吞并时,将返回相应的HttpStatus。 您甚至可以利用ResponseEntity,它有一个status方法,您可以在控制器方法或异常处理程序方法中传递所需的HttpStatus和return,如下所示: 控制器方法: 异常处理程序方法:
*将它用于任何非特殊情况都会很奇怪。@user2478398是的,正是我所说的。但实际上,在我看来,使用@ResponseStatus设置200也太过分了。200将由该方法的正常流返回。请参考有关其用法的良好解释。如果我理解您的意思,这并不完全正确,如果与@ControllerAdvice或@ExceptionHandler一起使用,这正是您可以做的。
@GetMapping("/resource")
public ResponseEntity<Object> getResource(){
if(resourcePresent){
return new ResponseEntity(resource, HttpStatus.OK);
} else {
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
}
}
@ExceptionHandler(BadRequestException.class)
public ResponseEntity<Object> handleBadRequestException(BadRequestException exception){
return new ResponseEntity<>(customResponse, HttpStatus.BAD_REQUEST);
}