2016-01-16 2 views
3

Я использую Java 8, Tomcat 8, Spring-WebMVC 4.2.2.RELEASE, FasterXML 2.6.3.Верните пустой JSON из контроллера пружины для ответа на пустоту

У меня есть следующий метод в моем контроллере

@RequestMapping(method = RequestMethod.POST) 
@ResponseBody 
public void updateCurrentUserDetails(@RequestBody final UserDTO userDTO) { 
    final UserWithId user = SecurityUtil.getCurrentUser(); 
    this.userAccountService.updateUserDetails(user.getUserId(), user.getUsername(), userDTO); 
} 

Этот метод возвращает пустоты, который решает в пустом (0 байт) ответ. Однако клиенты, подключающиеся к серверу, всегда ожидают, что сообщения JSON будут даже четными, если будет пустой ответ.

Поэтому я хотел бы настроить Spring/Jackson для возврата {} (2 байта) в этом случае.

Я уже думал о возврате нового объекта Object() во всех вызовах, которые возвращают void иначе, но IMO это грязный soution, и должно быть что-то лучше.

ответ

4

Его довольно легко.

Просто добавьте следующие строки в весеннем XML/Java конфигурации

<mvc:interceptors> 
    <bean class="de.st_ddt.util.VoidResponseHandlerInterceptor" /> 
</mvc:interceptors> 

И добавить этот класс в пути к классам

public class VoidResponseHandlerInterceptor extends HandlerInterceptorAdapter { 

    private static final String voidResponse = "{}"; 

    @Override 
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, 
      final ModelAndView modelAndView) throws IOException { 
     // Returned void? 
     if (!response.isCommitted()) { 
      // Used ModelAndView? 
      if (modelAndView != null) { 
       return; 
      } 
      // Access static resource? 
      if (DefaultServletHttpRequestHandler.class == handler.getClass()) { 
       return; 
      } 
      response.setStatus(200); 
      response.setCharacterEncoding("UTF-8"); 
      response.setContentType("application/json"); 
      try (final Writer writer = response.getWriter()) { 
       writer.write(voidResponse); 
      } 
      response.flushBuffer(); 
     } 
    } 
} 
9

Там не должно быть никакой необходимости делать все это. Вы можете просто использовать код ответа 204, который создан для ситуации, которую вы описываете. Вам даже не нужно ResponseBody аннотацию, просто используйте:

@RequestMapping(method = RequestMethod.POST) 
@ResponseStatus(HttpStatus.NO_CONTENT) 
public void updateCurrentUserDetails(@RequestBody final UserDTO userDTO) { 
    final UserWithId user = SecurityUtil.getCurrentUser(); 
    this.userAccountService.updateUserDetails(user.getUserId(), user.getUsername(), userDTO); 
} 

204 response code:

204 (No Content) код состояния указывает на то, что сервер имеет
успешно выполнил запрос, и что не является дополнительным
содержание для отправки в тело полезной нагрузки ответа.

+0

Хотя технически это правильный ответ, он не соответствует требованиям. Печальная правда заключается в том, что используемая клиентами инфраструктура не способна обрабатывать HTTP 204 или пустые тела. И сервер должен компенсировать это. Но, конечно, я буду там возиться. –

Смежные вопросы