从spring控制器返回空JSON以获得void响应

时间:2016-01-16 15:39:58

标签: java rest spring-mvc

我使用的是Java 8,Tomcat 8,Spring-WebMVC 4.2.2.RELEASE,FasterXML 2.6.3。

我的控制器中有以下方法

@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);
}

此方法返回void,该响应以空(0字节)响应结算。但是,连接到服务器的客户端总是希望JSON响应,如果它是空响应。

所以我想配置Spring / Jackson在这种情况下返回{}(2字节)。

我已经考虑过在返回无效的调用中返回新的Object(),但IMO这是一个肮脏的方法,必须有更好的东西。

2 个答案:

答案 0 :(得分:10)

不应该做任何事情。您可以使用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(无内容)状态代码表示服务器有
  成功完成了请求,并且没有额外的   要在响应有效负载主体中发送的内容。

答案 1 :(得分:5)

很容易。

只需将以下内容添加到spring xml / java config

即可
<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();
        }
    }
}
相关问题