我使用Spring mvc,我的问题是关于sendError
中的HttpServletResponse
方法。
有人可以告诉我哪个最好:
@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public void createAdvertisement(@RequestBody @Validated(value = ValidationGroups.AdvertisementCreateUpdate.class) Advertisement advertisement, BindingResult bindingResult,
HttpServletResponse response, @CurrentMember Member member) {
if (bindingResult.hasErrors()) {
response.setStatus(SC_BAD_REQUEST);
return;
}
response.setStatus(SC_CREATED);
advertisementService.createAdvertisement(member, advertisement);
}
然后:
@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public void createAdvertisement(@RequestBody @Validated(value = ValidationGroups.AdvertisementCreateUpdate.class) Advertisement advertisement, BindingResult bindingResult,
HttpServletResponse response, @CurrentMember Member member) {
if (bindingResult.hasErrors()) {
response.sendError(SC_BAD_REQUEST);
}
response.setStatus(SC_CREATED);
advertisementService.createAdvertisement(member, advertisement);
}
注意,在第一个代码段中,我设置状态代码并返回,而在第二个代码段中,我使用
sendError
方法。有人可以解释两种解决方案的优缺点吗?
最佳答案
两者之间的主要区别是sendError(int)
设置并锁定响应(调用sendError后无法更改它),它将显示错误页面。
另一方面,setStatus(int)
方法允许您在设置状态后更改响应,而且它不会调用错误页面。
因此,如果有错误,并且基本上不必准备特定的响应并在所有其他情况下使用sendError
,则基本上使用setStatus
。
Java EE documentation of the setStatus() method:中也对此进行了说明。
如果使用此方法设置错误代码,则不会触发容器的错误页面机制。如果存在错误,并且调用者希望调用Web应用程序中定义的错误页面,则必须改用sendError(int,java.lang.String)。