【问题标题】:Return empty JSON from spring controller for void response从 spring 控制器返回空 JSON 以获取 void 响应
【发布时间】:2016-01-16 15:39:58
【问题描述】:

我正在使用 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 字节)。

我已经考虑过在调用中到处返回 new Object() 否则会返回 void 但 IMO 这是一个肮脏的解决方案,必须有更好的东西。

【问题讨论】:

    标签: java rest spring-mvc


    【解决方案1】:

    应该没有必要做所有这些。您可以只使用 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(无内容)状态码表示服务器有
    成功完成了请求并且没有额外的
    要在响应负载正文中发送的内容。

    【讨论】:

    • 虽然从技术上讲这是正确的答案,但它不符合要求。可悲的事实是,客户端使用的框架无法处理 HTTP 204 或空正文。并且服务器应该弥补它。但我当然会继续唠叨。
    【解决方案2】:

    很简单。

    只需将以下内容添加到您的 spring 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 2016-08-30
      • 2013-09-20
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      相关资源
      最近更新 更多