当我设置
时,知道为什么我得到“HTTP / 1.1 200 OK”Response.status(Response.Status.NOT_FOUND)
我可以看到这已在响应正文中正确设置了吗?
curl -v http://my_host/api/v1/user/99999999
HTTP / 1.1 200确定
Access-Control-Allow-Origin:*
Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE
...
{“statusType”:“NOT_FOUND”,“entity”:“无法检索ID为99999999的产品”,“entityType”:“java.lang.String”,“status”:404,“metadata”:{ }}
@RequestMapping(value="/product/{id}", method=RequestMethod.GET)
@ResponseBody
public Response getProduct(@PathVariable String id) {
Product product = null; //productService.getProduct(id);
if (product == null) {
// I KNOW I GET HERE !!!
return Response.status(Response.Status.NOT_FOUND).entity("Unable to retrieve product with id:"+id). build();
}
// AS EXPECTED I DO NOT GET HERE
Map<String, Object> json = productRenderer.renderProduct(....);
return Response.ok(json, MediaType.APPLICATION_JSON).type("application/json").build();
}
BTW正在使用Spring版本3.2.10
答案 0 :(得分:2)
尝试返回Spring的ResponseEntity
。它适用于我并设置正确的响应状态:
例如:
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
或与身体:
return new ResponseEntity<>(body, HttpStatus.OK);
您也可以像在问题中使用Response
一样使用构建器模式(以下示例来自ResponseEntity的JavaDoc:
return ResponseEntity
.created(location)
.header("MyResponseHeader", "MyValue")
.body("Hello World");
更多详细信息可以在文档中找到:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html
答案 1 :(得分:0)
导致此问题的原因是由于MappingJacksonHttpMessageConverter bean的设置,Response对象已呈现为JSON。因此,HTTP响应始终为200,响应主体包含javax.ws.rs.core.Response
的JSON表示。
<bean id="..." class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
为了解决这个问题,我使用org.springframework.web.bind.annotation.ResponseStatus
注释抛出了一个自定义异常:
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ProductNotFoundException extends Exception {
...
}
因此我的原始方法现在看起来像:
@RequestMapping(value="/product/{id}", method=RequestMethod.GET)
@ResponseBody
public Response getProduct(@PathVariable String id) throws ProductNotFoundException {
...
}