Spring MVC Restful服务响应

时间:2014-10-10 08:22:24

标签: spring rest spring-mvc

当我设置

时,知道为什么我得到“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

2 个答案:

答案 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 {
    ...
}