@ResponseStatus 是标记一个方法或异常类在返回时响应的http状态。其代码注释如下:
*
* The status code is applied to the HTTP response when the handler
* method is invoked and overrides status information set by other means,
* like {@code ResponseEntity} or {@code "redirect:"}.
*
*
Warning: when using this annotation on an exception
* class, or when setting the {@code reason} attribute of this annotation,
* the {@code HttpServletResponse.sendError} method will be used.
*
*
With {@code HttpServletResponse.sendError}, the response is considered
* complete and should not be written to any further. Furthermore, the Servlet
* container will typically write an HTML error page therefore making the
* use of a {@code reason} unsuitable for REST APIs. For such cases it is
* preferable to use a {@link org.springframework.http.ResponseEntity} as
* a return type and avoid the use of {@code @ResponseStatus} altogether.
*
*
Note that a controller class may also be annotated with
* {@code @ResponseStatus} and is then inherited by all {@code @RequestMapping}
* methods.
@ResponseStatus 可以结合 @ResponseBody 一起使用。
@RequestMapping("/testResponseBody")
@ResponseBody
public Map testResponseBody(){
return ImmutableMap.of("key", "value");
}
@RequestMapping("/testResponseBodyFaild")
@ResponseBody
@ResponseStatus(HttpStatus.NOT_IMPLEMENTED)
public Map testResponseBodyFaild(){
return ImmutableMap.of("key", "faild");
}
这两个handler method返回的http status code(http状态码) 分别是200 和 501。
ResponseEntity 是在 org.springframework.http.HttpEntity 的基础上添加了http status code(http状态码),用于RestTemplate以及@Controller的HandlerMethod。它在Controoler中或者用于服务端响应时,作用是和@ResponseStatus与@ResponseBody结合起来的功能一样的。用于RestTemplate时,它是接收服务端返回的http status code 和 reason的。
代码注释如下:
* Extension of {@link HttpEntity} that adds a {@link HttpStatus} status code.
* Used in {@code RestTemplate} as well {@code @Controller} methods.
*
* In {@code RestTemplate}, this class is returned by
* {@link org.springframework.web.client.RestTemplate#getForEntity getForEntity()} and
* {@link org.springframework.web.client.RestTemplate#exchange exchange()}:
*
* ResponseEntity<String> entity = template.getForEntity("http://example.com", String.class);
* String body = entity.getBody();
* MediaType contentType = entity.getHeaders().getContentType();
* HttpStatus statusCode = entity.getStatusCode();
*
*
* Can also be used in Spring MVC, as the return value from a @Controller method:
*
* @RequestMapping("/handle")
* public ResponseEntity<String> handle() {
* URI location = ...;
* HttpHeaders responseHeaders = new HttpHeaders();
* responseHeaders.setLocation(location);
* responseHeaders.set("MyResponseHeader", "MyValue");
* return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
* }
*
* Or, by using a builder accessible via static methods:
*
* @RequestMapping("/handle")
* public ResponseEntity<String> handle() {
* URI location = ...;
* return ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body("Hello World");
* }
*
ResponseEntity 和 @ResponseStatus 一起使用是无效的
@RequestMapping("/testResponseEntity")
public ResponseEntity
这三个handler method返回的http status code(http状态码) 分别是200 、 200 和 400。
完整的TestController代码
import com.google.common.collect.ImmutableMap;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* Created by saleson on 2017/5/5.
*/
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/testResponseEntity")
public ResponseEntity> testResponseEntity(){
Map map = ImmutableMap.of("key", "value");
return ResponseEntity.ok(map);
}
@RequestMapping("/testResponseEntityFaild")
@ResponseStatus(HttpStatus.NOT_IMPLEMENTED)
public ResponseEntity> testResponseEntityFaild(){
Map map = ImmutableMap.of("key", "faild");
return ResponseEntity.ok(map);
}
@RequestMapping("/testResponseEntityFaild2")
public ResponseEntity> testResponseEntityFaild2(){
return ResponseEntity.badRequest().body(ImmutableMap.of("key", "faild"));
}
@RequestMapping("/testResponseBody")
@ResponseBody
public Map testResponseBody(){
return ImmutableMap.of("key", "value");
}
@RequestMapping("/testResponseBodyFaild")
@ResponseBody
@ResponseStatus(HttpStatus.NOT_IMPLEMENTED)
public Map testResponseBodyFaild(){
return ImmutableMap.of("key", "faild");
}
}
返回的http status code截图: