当前位置:首页 > 行业动态 > 正文

SpringBoot中notempty注解不生效如何解决

技术介绍

SpringBoot是一个基于Spring框架的快速开发平台,它简化了传统Spring应用的初始搭建以及开发过程,在SpringBoot中,我们可以使用注解来配置和验证数据,其中@NotEmpty注解就是一个常用的验证工具,有时候在使用@NotEmpty注解时,会发现它不生效,导致数据验证失败,本文将介绍如何解决SpringBoot中@NotEmpty注解不生效的问题。

问题分析

1、确认注解使用正确

我们需要确认@NotEmpty注解的使用是否正确,在SpringBoot中,我们可以在字段或参数前添加@NotEmpty注解,以表示该字段或参数不能为空。

public class User {
    @NotEmpty(message = "用户名不能为空")
    private String username;
}

2、检查依赖版本

我们需要检查项目中的依赖版本是否正确。@NotEmpty注解是Java Bean Validation(JSR 303)规范的一部分,因此我们需要引入Hibernate Validator作为验证器,在SpringBoot项目中,我们通常使用Maven或Gradle来管理依赖,请确保项目的依赖中包含以下内容:

spring-boot-starter-validation:用于引入Hibernate Validator验证器。

hibernate-validator:用于实现Java Bean Validation规范。

javax.validation:用于定义Java Bean Validation的API。

如果发现依赖版本不正确,可以通过修改项目的pom.xml或build.gradle文件来更新依赖版本。

解决方案

1、确保实体类上有相应的注解

在使用@NotEmpty注解之前,需要确保实体类上有相应的注解,我们可以在实体类上添加@Entity注解,以表示这是一个数据库表对应的实体类,我们还需要为实体类的字段添加相应的注解,如@Id、@GeneratedValue等,这样,Hibernate才能识别这些实体类和字段,从而正确地进行数据验证。

2、配置验证器

在使用@NotEmpty注解之前,需要先配置验证器,在SpringBoot项目中,我们可以通过实现Validator接口来自定义验证器,我们可以创建一个名为MyValidator的类,并实现Validator接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import java.util.Set;
@Component
public class MyValidator implements Validator {
    @Autowired
    private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
    @Override
    public void validate(Object target, Errors errors) {
        Validator validate = factory.getValidator();
        Set<ConstraintViolation<Object>> violations = validate.validate(target);
        for (ConstraintViolation<Object> violation : violations) {
            errors.rejectValue(violation.getPropertyPath().toString(), violation.getMessage());
        }
    }
}

在上述代码中,我们首先导入了所需的依赖包,然后实现了Validator接口,在validate方法中,我们使用了Hibernate提供的ValidatorFactory来获取默认的验证器实例,并对目标对象进行验证,我们将验证结果添加到Errors对象中。

3、在Controller中使用验证器

在使用@NotEmpty注解之前,需要在Controller中注册自定义的验证器,在SpringBoot项目中,我们可以通过实现WebMvcConfigurer接口来自定义MVC配置,我们可以创建一个名为MyWebMvcConfigurer的类,并实现WebMvcConfigurer接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.validation.Validator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Autowired
    private MyValidator myValidator;
    /**
     * 将自定义的验证器添加到全局的拦截器链中
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor()) //添加LocaleChangeInterceptor拦截器处理语言切换问题(防止乱码)不放在这里!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!不然会报错找不到LocaleChangeInterceptor拦截器的错误信息~_~)     //这里为了演示所以注释掉LocaleChangeInterceptor拦截器的添加(因为这个拦截器是用来处理语言切换问题的)不放在这里以免影响本示例的演示效果~_~)//注意不要忘记最后要执行super方法哦^_^~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        返回null即可不加入任何拦截器~_~)     //这里为了演示所以注释掉LocaleChangeInterceptor拦截器的添加(因为这个拦截器是用来处理语言切换问题的)不放在这里以免影响本示例的演示效果~_~)//注意不要忘记最后要执行super方法哦^_^~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                返回null即可不加入任何拦截器~_~)     //这里为了演示所以注释掉LocaleChangeInterceptor拦截器的添加(因为这个拦截器是用来处理语言切换问题的)不放在这里以免影响本示例的演示效果~_~)//注意不要忘记最后要执行super方法哦^_^~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            返回null即可不加入任何拦截器~_~)     //这里为了演示所以注释掉LocaleChangeInterceptor拦截器的添加(因为这个拦截器是用来处理语言切换问题的)不放在这里以免影响本示例的演示效果~_~)//注意不要忘记最后要执行super方法哦^_^~                                                                                                                                if (myValidator != null && registry instanceof DefaultHandlerMethodArgumentResolver) {                            registry instanceof DefaultHandlerMethodArgumentResolver defaultHandlerMethodArgumentResolver = (DefaultHandlerMethodArgumentResolver) registry;                            defaultHandlerMethodArgumentResolvers = new CopyOnWriteArrayList<>(defaultHandlerMethodArgumentResolvers);                            defaultHandlerMethodArgumentResolvers.add((RequestBodyArgumentResolver) myValidator);                        } else if (registry instanceof RequestBodyArgumentResolver)                    {                        registry instanceof RequestBodyArgumentResolver requestBodyArgumentResolver = (RequestBodyArgumentResolver) registry;                        requestBodyArgumentResolvers = new CopyOnWriteArrayList<>(requestBodyArgumentResolvers);                        requestBodyArgumentResolvers.add((RequestBodyArgumentResolver) myValidator);                    } else if (registry instanceof HttpMessageConverter<?>)                    {                            registry instanceof HttpMessageConverter<?> httpMessageConverter = (HttpMessageConverter<?>) registry;                            httpMessageConverters = new ArrayList<>(httpMessageConverters);                            for (HttpMessageConverter<?> converter : httpMessageConverters)                            {                                if (converter instanceof FormHttpMessageConverter || converter instanceof JsonHttpMessageConverter || converter instanceof MultipartFormDataHttpMessageConverter || converter instanceof StringHttpMessageConverter)                        {                                    converter = new FormHttpMessageConverter()                                {                                    @Override public List<MediaType> getSupportedMediaTypes()                                    { return Arrays://转换成List<MediaType>类型 return Arrays$.asList(MediaType$.APPLICATION_JSON);                                    }                                    @Override protected Charset getCharset()                                    { return CharsetUtility$.UTF_8;                                    }                                    };                                    httpMessageConvertersAdd((RequestBodyHttpMessageConverter) converter);                                } else if (converter instanceof ResourceHttpMessageConverter && converter instanceof FormHttpMessageConverter)                        {                                        converter = new ResourceHttpMessageConverter()                                {                                        @Override public List<MediaType> getSupportedMediaTypes()                                        { return Arrays://转换成List<MediaType>类型 return Arrays$.asList(MediaType$.APPLICATION_JSON);                                        }                                        @Override protected Charset getCharset()                                        { return CharsetUtility$.UTF_8//return null//;                                        }
0

随机文章