Spring Controller同路径双方法适配问题:携带日期参数的请求报400 Bad Request且无法进入方法
Spring Controller同路径双方法适配问题:携带日期参数的请求报400 Bad Request且无法进入方法
先给你梳理下问题的核心,再一步步解决:
一、先抓最直接的400原因:请求体格式不合法
你提到带日期参数时,前端的a.data是这样的:
"{\"area\":\"AQ\",\"location\":\"ENG\",\"family\":null,\"status\":\"Active\",\"startDate\":\"02/03/2025\"
明显最后少了个闭合的}!这是非法JSON格式,Spring在解析@RequestBody的时候,会直接抛出HttpMessageNotReadableException,返回400错误——因为请求体解析是在方法执行之前完成的,根本不会进入你的Controller方法。
所以第一步必须先修复前端的JSON序列化逻辑,确保带日期时生成的是完整合法的JSON字符串。比如检查前端处理日期的代码,是不是拼接JSON时漏了结尾的括号,或者用JSON.stringify的时候有没有异常导致截断。
二、优化Controller映射,避免模糊匹配和冗余配置
你之前用headers来区分请求类型,其实Spring更推荐用consumes属性(指定接收的Content-Type),语义更清晰,也能避免映射冲突。另外要明确两个方法的适用场景:
优化后的Controller代码示例
@Controller public class SearchController { // 处理JSON格式的POST请求(GET请求一般不携带请求体,所以这里只指定POST更合理) @RequestMapping(value = SEARCH_BY_FILTERS_ALL_PRODUCTS_NEW, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, // 替代headers,明确接收JSON produces = MediaType.APPLICATION_JSON_VALUE) @Secured(Permissions.VIEW_PRODUCTS) @ResponseBody public AjaxJsonResponseBuilder searchAllProductsJson(@RequestBody SearchFiltersRequest request) { return executeSearch(request); } // 处理非JSON的请求:比如GET带URL参数、POST表单参数 @RequestMapping(value = SEARCH_BY_FILTERS_ALL_PRODUCTS_NEW, method = {RequestMethod.GET, RequestMethod.POST}, consumes = "!application/json") // 排除JSON类型的请求 @Secured(Permissions.VIEW_PRODUCTS) @ResponseBody public AjaxJsonResponseBuilder searchAllProducts(@ModelAttribute SearchFiltersRequest request) { return executeSearch(request); } }
额外调整:实体类支持日期参数解析
如果修复前端JSON后还是有日期解析问题,需要在SearchFiltersRequest的日期字段上添加格式化注解,让Spring能正确解析日期字符串:
public class SearchFiltersRequest { // 其他字段... // 针对JSON请求体的日期解析 @JsonFormat(pattern = "MM/dd/yyyy") // 针对URL/表单参数的日期解析 @DateTimeFormat(pattern = "MM/dd/yyyy") private LocalDate startDate; // 所有字段的getter、setter必须齐全 }
三、排查启动时的模糊映射错误
你第三次尝试去掉method属性后启动报错,是因为两个方法的映射条件完全重叠了(相同的value,没有其他区分条件),Spring无法判断该路由到哪个方法。用上面的consumes配置就能让两个方法的映射条件互斥,避免这个问题。
四、如果还有问题,就加日志抓详细错误
可以全局捕获请求体解析的异常,打印具体错误信息:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(HttpMessageNotReadableException.class) @ResponseBody public AjaxJsonResponseBuilder handleJsonParseError(HttpMessageNotReadableException e) { // 这里可以打印详细栈信息,或者返回给前端具体错误 log.error("请求体解析失败:", e); return AjaxJsonResponseBuilder.error("请求格式错误:" + e.getLocalizedMessage()); } }
这样就能精准定位是JSON格式问题,还是日期解析格式不匹配的问题了。
备注:内容来源于stack exchange,提问作者Michu93
相关产品推荐
相关产品推荐

