带有@ModelAttribute的Spring Mvc应用程序PUT请求与多部分请求表单未绑定

时间:2018-08-09 06:09:13

标签: java rest spring-mvc put modelattribute

我有处理REST API的Spring应用程序。在我将XML配置转换为注释配置之前,所有方法都运行良好。当时我在一些API中遇到问题。 API是使用@ModelAttribute的PUT请求。该ajax请求的数据未绑定到剩余请求中。

@RequestMapping(method=RequestMethod.PUT,value="/user")
    public ResponseEntity<?> updatePlanSponsor(@ModelAttribute UserDTO user,BindingResult errors, @CookieValue(value="userID") Long userId){
------
}

所有其他请求,例如带有application / JSON的PUT,带有multipart / form-data的POST;  如果是包含多部分/表单数据的PUT;表单未绑定到dto类

1 个答案:

答案 0 :(得分:1)

我确实错误地添加了多部分解析器。 多部分的PUT请求仅支持PutAwareCommonsMultipartResolverCommonsMultipartResolver不支持带有Multipart的PUT。

 public class PutAwareCommonsMultipartResolver extends CommonsMultipartResolver {

    private static final String MULTIPART = "multipart/";

    @Override
    public boolean isMultipart(HttpServletRequest request) {
        return request != null && isMultipartContent(request);
    }

    /**
     * Utility method that determines whether the request contains multipart
     * content.
     * 
     * @param request The servlet request to be evaluated. Must be non-null.
     * 
     * @return <code>true</code> if the request is multipart; {@code false}
     * otherwise.
     * 
     * @see ServletFileUpload#isMultipartContent(HttpServletRequest)
     */
    public static final boolean isMultipartContent(HttpServletRequest request) {
        final String method = request.getMethod().toLowerCase();
        if (!method.equals("post") && !method.equals("put")) {
            return false;
        }
        String contentType = request.getContentType();
        if (contentType == null) {
            return false;
        }
        if (contentType.toLowerCase().startsWith(MULTIPART)) {
            return true;
        }
        return false;
    }

}