我使用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)。

10-04 15:23