2015-09-09 5 views
3

Я использую Spring mvc, и мой вопрос касается метода sendError от HttpServletResponse.HttpServletResponse.sendError (int sc) vs HttpServletResponse.setStatus (int sc)

Может кто-то пожалуйста, скажите мне, что лучше между:

@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.

Может кто-нибудь объяснить причины и недостатки обоих решений?

+0

Почему закрытие ??? – balteo

+0

Я бы тоже сказал. Вместо этого верните «ResponseEntitiy» с соответствующим статусом и дайте рамке решить. –

ответ

0

Основное отличие состоит в том, что sendError(int) устанавливает и блокирует ответ (вы не можете изменить его после вызова sendError), и на нем отобразится страница с ошибкой.

С другой стороны, метод setStatus(int) позволяет изменить ответ после установки статуса, а также не вызывать страницу с ошибкой.

В основном используйте sendError, если есть ошибка, и вам не нужно готовить конкретный ответ и использовать setStatus для всех других ситуаций.

Это также объясняется в Java EE documentation of the setStatus() method:

Если этот метод используется для установки кода ошибки, то механизм страница ошибки контейнера не будет запускаться. Если есть ошибка, и вызывающий пользователь хочет вызвать страницу ошибки, определенную в веб-приложении, вместо этого следует использовать sendError (int, java.lang.String).