SpringBoot是一个基于Spring框架的快速开发平台,它简化了传统Spring应用的初始搭建以及开发过程,在SpringBoot中,我们可以使用注解来配置和验证数据,其中@NotEmpty
注解就是一个常用的验证工具,有时候在使用@NotEmpty
注解时,会发现它不生效,导致数据验证失败,本文将介绍如何解决SpringBoot中@NotEmpty
注解不生效的问题。
创新互联是一家专注于网站设计、成都网站建设与策划设计,井冈山网站建设哪家好?创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:井冈山等地区。井冈山做网站价格咨询:028-86922220
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> violations = validate.validate(target); for (ConstraintViolation
在上述代码中,我们首先导入了所需的依赖包,然后实现了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 ListgetSupportedMediaTypes() { return Arrays://转换成List 类型 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 getSupportedMediaTypes() { return Arrays://转换成List 类型 return Arrays$.asList(MediaType$.APPLICATION_JSON); } @Override protected Charset getCharset() { return CharsetUtility$.UTF_8//return null//; }
当前名称:SpringBoot中notempty注解不生效如何解决
文章网址:http://www.shufengxianlan.com/qtweb/news44/185294.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联