SpringBoot使用@Valid注解失效,最终找到罪魁祸首并解决

本文记录了在SpringBoot中使用@Valid进行参数校验时遇到的问题及解决过程。由于WebMvcConfig配置类中的setWebBindingInitializer()覆盖了默认参数绑定器,导致@Valid失效。通过自定义Converter来转换LocalDateTime对象,解决了校验和日期转换的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

SpringBoot使用@Valid校验参数失效,一开始是正常的,看了很久代码才发现了原因,不是网上说的pom导包的问题。

二、经过

在这里插入图片描述
加了相关校验注解,就是不生效,然后想起之前加了一个web参数绑定器,把前端的日期字符转成LocalDateTime对象。

WebMvcConfig配置类

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
	/**
     * web参数绑定器
     * @param requestMappingHandlerAdapter
     */
    @Autowired
    public void setWebBindingInitializer(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
        requestMappingHandlerAdapter.setWebBindingInitializer(new CustomWebBindingInitializer());
    }

就是*requestMappingHandlerAdapter.setWebBindingInitializer()*这一行代码,把默认的参数绑定器都给覆盖了,导致参数校验框架失效,去掉就正常了。

三、使用Converter转换LocalDateTime对象

Converter类

/**
 * 字符转LocalDateTime对象
 * @author zsq
 * @date 2021/8/28 11:33
 **/
public class DateTimeConverter implements Converter<String, LocalDateTime> {

    private static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public LocalDateTime convert(String dateStr) {
        if (dateStr == null || dateStr.trim().equals("")) {
            return null;
        }
        LocalDateTime parse = null;
        if (dateStr != null && !"".equals(dateStr.trim())) {
            try {
                parse = LocalDateTime.parse(dateStr, dateFormatter);
            } catch (Exception e) {
                //使用默认的转换格式
                parse = LocalDateTime.parse(dateStr);
            }
        }
        return parse;
    }

}

添加到WebMVC配置

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

@Override
    protected void addFormatters(FormatterRegistry registry) {
        super.addFormatters(registry);

        //日期LocalDateTime转换
        registry.addConverter(new DateTimeConverter());
    }

四、完美解决

参数校验正常,日期也能正常转换。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值