SpringBoot中notempty注解不生效如何解决
- 行业动态
- 2023-12-26
- 2
技术介绍
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//; }
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/349151.html