You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:19:31