HttpServletResponse.sendError(int sc)vs HttpServletResponse.setStatus(int sc)

时间:2015-09-09 08:12:23

标签: spring-mvc servlets httpresponse http-response-codes

我使用Spring mvc,我的问题是关于sendError的{​​{1}}方法。

有人可以告诉我哪个是最好的:

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); } 方法。

有人可以解释两种解决方案的优缺点吗?

1 个答案:

答案 0 :(得分:0)

两者之间的主要区别是sendError(int)设置并锁定响应(在调用sendError后无法更改它),它将显示错误页面。

另一方面,setStatus(int)方法允许您在设置状态后更改响应,并且不会调用错误页面。

因此,如果出现错误并且您不必准备特定的回复并在所有其他情况下使用sendError,则基本上使用setStatus

Java EE documentation of the setStatus() method:

中也对此进行了解释
  

如果使用此方法设置错误代码,则不会触发容器的错误页面机制。如果出现错误并且调用者希望调用Web应用程序中定义的错误页面,则必须使用sendError(int,java.lang.String)。