一、前言

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());
    }

四、完美解决

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐