我正在学习Spring Core认证,我对Spring MVC如何处理示例Spring MVC Web应用程序的控制器方法有以下疑问。
因此,在我的例子中,我有这样的方法:
/**
* Creates a new Account, setting its URL as the Location header on the
* response.
*/
@RequestMapping(value = "/accounts", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public HttpEntity<String> createAccount(@RequestBody Account newAccount,
@Value("#{request.requestURL}") StringBuffer url) {
Account account = accountManager.save(newAccount);
return entityWithLocation(url, account.getEntityId());
}
我知道这种方法会在数据库中创建一个新帐户。
因此,它处理指向URL/accounts的POSTHttp请求(表示插入操作)。
createAccount()方法采用两个参数:
@RequestBody Account newAccount:我认为它从请求的主体字段中提取AccountSON格式,然后自动转换为标准Java对象(在本例中为Account类的实例)。
@Value("#{request.requestURL}")StringBuffer-url:我认为这和一样
request.getRequestURL();
它包含客户端用于发出请求的URL。这是真的吗?但是,为什么它将其放入StringBuffer而不是简单的String?
然后,该方法只需使用一个DAO类将对象持久化到DB上,最后返回一个HttpEntity对象。
这个HttpEntity是由同一类中定义的entityWithLocation()方法创建的,这个方法是:
private HttpEntity<String> entityWithLocation(StringBuffer url,
Object resourceId) {
// Configure and return an HttpEntity object - it will be used to build
// the HttpServletResponse
HttpHeaders headers = new HttpHeaders();
headers.setLocation(getLocationForChildResource(url, resourceId));
return new HttpEntity<String>(headers);
}
根据我阅读Spring官方文档的理解,在本例中,该对象表示HttpResponse实体,该实体由头和主体组成。
我对这个项目的怀疑是:
在我的情况下,它只设置具有url值(客户端用于发出请求的url)和新插入对象id的heder。此HttpResponse的正文字段为空?
为什么我必须返回这个HttpResponse对象?用于什么?
Tnx
@Value("#{request.requestURL}")StringBuffer url:我认为这和一样
request.getRequestURL();
它包含客户端用于发出请求的URL。这是真的吗?但是为什么它把它放在StringBuffer中,而不是放在一个简单的String中呢?
因为方法HttpServletRequest.getRequestURL()
返回的是StringBuffer,而不是String。
此HttpResponse的正文字段为空?
是的,因为代码没有填充它。你可以简单地使用浏览器来调用这个操作并查看返回的响应。
为什么我必须返回这个HttpResponse对象?用于什么?
您不必。但是您可以选择。这取决于你。你应该知道你为什么要退货。这里程序员的意图是返回一个没有正文的HTTP响应,带有一个包含URL和CREATED状态的Location头。这是REST应用程序中POST之后要返回的常规内容:POST用于创建新资源,它返回CREATED状态以表示资源已正确创建,以及创建的资源的URL,这样客户端就可以获得该资源并检查它包含的内容。