REST - 使用Spring MVC返回创建的对象

时间:2013-04-21 02:46:55

标签: java json rest spring-mvc standards

我有一个REST调用接受一个JSON对象,比方说,一个人。创建此对象(验证并保存到数据库)后,我需要返回新创建的JSON对象。

我认为标准做法是返回201 Accepted而不是立即返回对象。但我的应用程序需要立即新创建的对象。

我有一个控制器方法,它接受一个POST调用,调用一个服务类,然后调用一个使用Hibernate创建对象的DAO。一旦它保存到数据库,我正在调用另一个控制器方法,该方法获取人员的ID并返回对象。

我的问题是,这是更好的方法吗?这是调用另一个Controller方法来获取新创建的对象。或者POST调用本身应该返回Object。

主要问题是: 调用另一种方法需要往返,我猜这是一种矫枉过正。 (服务 - > DAO-> Hibernate->数据库)。相反,我认为我应该在相同的调用(从处理POST的方法)中保存后立即从数据库中获取对象。

这里的架构标准是什么?

3 个答案:

答案 0 :(得分:17)

尝试使用ResponseEntity返回HTTP状态以及您需要的对象。

示例代码是(这是我的代码,我将返回Customer对象,根据您的需要进行更改):

// imports (for your reference)
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

// spring controller method
@RequestMapping(value = "getcust/{custid}", method = RequestMethod.GET, produces={"application/json"})
public ResponseEntity<Customer> getToken(@PathVariable("custid") final String custid, HttpServletRequest request) {

    customer = service.getCustById(custid);

    return new ResponseEntity<Customer>(customer, HttpStatus.OK);
}

阅读此documentation了解更多信息。那里提供了一些示例代码。

答案 1 :(得分:5)

来自HTTP specification for POST

  

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含一个描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节)。

您将在响应正文中返回的内容将取决于您对an entity which describes the status of the request and refers to the new resource的解释程度 - 并且许多实现只返回新创建的实体本身的表示。最重要的是将响应中的Location标头设置为新创建的资源的URI,以便客户可以选择立即获取它。

答案 2 :(得分:0)

您可以在@ResponseStatus之后使用@ResponseBody持久保存实体对象,但它不是标准的,因此您的客户必须了解此自定义,否则如果您的客户端依赖于标准API,则必须卡住通过返回void来达到标准。