本文将为您提供关于HibernateValidator,自定义ResourceBundleLocator和Spring的详细介绍,我们还将为您解释springvalidation自定义的相关知识,同时
本文将为您提供关于Hibernate Validator,自定义ResourceBundleLocator和Spring的详细介绍,我们还将为您解释spring validation 自定义的相关知识,同时,我们还将为您提供关于at org.apache.catalina.webresources.CachedResource.validateResources、hibernate 和 spring 整合:Unable to get the default Bean Validation factory、hibernate 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.i...、HibernateValidator自定义验证的实用信息。
本文目录一览:- Hibernate Validator,自定义ResourceBundleLocator和Spring(spring validation 自定义)
- at org.apache.catalina.webresources.CachedResource.validateResources
- hibernate 和 spring 整合:Unable to get the default Bean Validation factory
- hibernate 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.i...
- HibernateValidator自定义验证
Hibernate Validator,自定义ResourceBundleLocator和Spring(spring validation 自定义)
我试图覆盖休眠验证4.1中的默认ResourceBundleLocator。到目前为止,它可以完美地工作,但是其用法的唯一示例包括用于实例化ValidationFactory的Java代码。
当将Web应用程序与spring一起使用时,hibernate验证将自动进行配置(只有适当的hibernate验证*
.jar文件应存在并且会自动使用)。在那种情况下,我该如何替代ResourceBundleLocator?在任何属性或applicationContext.xml文件中,都看不到任何指定我的自定义ResourceBundleLocator的方式。
at org.apache.catalina.webresources.CachedResource.validateResources
"catalina-exec-659" #5239 daemon prio=5 os_prio=0 tid=0x00007fcba8099800 nid=0x581 waiting for monitor entry [0x00007fcdac5d7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.catalina.webresources.CachedResource.validateResources(CachedResource.java:122)
- waiting to lock <0x000000068fb44478> (a org.apache.catalina.webresources.CachedResource)
at org.apache.catalina.webresources.Cache.getResources(Cache.java:129)
at org.apache.catalina.webresources.StandardRoot.getResources(StandardRoot.java:315)
at org.apache.catalina.webresources.StandardRoot.getClassLoaderResources(StandardRoot.java:231)
at org.apache.catalina.loader.WebappClassLoaderBase.findResources(WebappClassLoaderBase.java:939)
at java.lang.ClassLoader.getResources(ClassLoader.java:1142)
at com.sun.jersey.spi.service.ServiceFinder.getResources(ServiceFinder.java:352)
at com.sun.jersey.spi.service.ServiceFinder.access$200(ServiceFinder.java:159)
at com.sun.jersey.spi.service.ServiceFinder$AbstractLazyIterator.setConfigs(ServiceFinder.java:720)
at com.sun.jersey.spi.service.ServiceFinder$AbstractLazyIterator.hasNext(ServiceFinder.java:732)
at com.sun.jersey.spi.service.ServiceFinder.toClassArray(ServiceFinder.java:595)
at com.sun.jersey.api.client.Client.init(Client.java:213)
at com.sun.jersey.api.client.Client.access$000(Client.java:118)
at com.sun.jersey.api.client.Client$1.f(Client.java:191)
at com.sun.jersey.api.client.Client$1.f(Client.java:187)
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
at com.sun.jersey.api.client.Client.<init>(Client.java:187)
at com.sun.jersey.api.client.Client.<init>(Client.java:170)
at com.sun.jersey.api.client.Client.create(Client.java:679)
hibernate 和 spring 整合:Unable to get the default Bean Validation factory
在使用 Spring 和 Hibernate 进行结合的时候出现了这个问题!
<prop key="javax.persistence.validation.mode">none</prop>
在 hibernate 配置文件中添加这个!
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!-- 关闭 bean validate 验证 -->
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
或
<!-- 关闭 bean validate 验证 -->
<property name="javax.persistence.validation.mode">none</property>
其实这个问题是我们自己造成的!为什么这么说?因为 javaee6 有 bean-validator.jar 这个包,用 javae5 就没事了,我们也可把这个包删除了
<persistence ...>
<persistence-unit ...>
...
<properties>
<property name="javax.persistence.validation.mode"
value="callback, ddl"/>
</properties>
</persistence-unit>
</persistence>
这是 hibernate 官方文档的一段话!
意思就是在 hibernate.cfg.xml 或者是
persistence.xml 文件下面需要配置
javax.persistence.validation.mode 属性!
特别的!在 Hibernate 中默认的 <prop key="javax.persistence.validation.mode">none</prop>
是 auto 而不是 none!
愚见!有不同的想法的请留言!谢谢
————————————————
版权声明:本文为 CSDN 博主「q1054261752」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q1054261752/article/details/52564213
hibernate 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.i...
<!-- 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.xxx 这类的问题,这里的xxx是指的一些类 -->
<!-- 可能是版本冲突导致的这个问题,因为我的 hibernate-validator 之前是使用的 5.x 以上的版本,但是我的hibernate-core用的是4.2.4.Final,不兼容所以导致了这个异常,所以异常果然一般要在最下面找 换成 4.2.0.Final 之后,问题解决 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.4.Final</version>
</dependency>
<!-- 然后解决了这个问题之后,报了下面的异常,然后导入了这三个slf4j的依赖,成功解决异常,项目启动成功 -->
<!-- 解决 java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 给maven项目指定编译版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
HibernateValidator自定义验证
前言
在自己的摸索下对HibernateValidator有了初步的认识,可以使用已有的约束条件对字段做出限制,减少不要代码的出现,使代码更简洁。
但在最近的实际使用中,出现了一些无法使用框架处理的问题,例如,在第三方请求我的接口时,根据status字段区分不同的业务逻辑;status=1进行A逻辑处理,status=2进行B逻辑处理;在网络了检索了相关信息后,做出如下总结。
步骤
-
使用通用Mapper插件生成实体类和mapper,这里为了聚焦对HibernateValidator的使用,把关注点放在实体类Brand中,在实体类中,对status字段添加自定义约束@StatusConstraint
package com.codeup.mybatisjoin.model; import com.codeup.mybatisjoin.validation.StatusConstraint; import lombok.Data; import javax.persistence.Column; import javax.persistence.Id; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data public class Brand { @Id @Column(name = "brand_ID") private Long brandId; /** * 使用`@NotNull`添加约束 */ @Column(name = "vendor_ID") @NotNull(message = "[vendorId]不可为空") private Long vendorId; /** * 使用`@NotBlank`添加约束 */ @Column(name = "brand_name") @NotBlank(message = "[brandName]字段不可为空") private String brandName; private String description; /** * 自定义约束 */ @StatusConstraint(message = "[status]为1或者2") private String status; }
-
@StatusConstraint
实现步骤和自定义注解相似package com.codeup.mybatisjoin.validation; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @ProjectName: mybatisjoin * @Package: com.codeup.mybatisjoin.validation * @ClassName: StatusConstraint * @Author: lhc * @Description: 状态约束 * @Date: 2019/8/22 下午 3:36 */ @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) /** * 指出当前约束是通过`StatusConstraintValidator.class`来实现的 */ @Constraint(validatedBy = StatusConstraintValidator.class) public @interface StatusConstraint { /** * 配置message信息 * @return */ String message() default "违规参数"; /** * 分组 * @return */ Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
-
通过查看源代码里面的文档得知要要实现
ConstraintValidator
接口@Documented @Target({ ANNOTATION_TYPE }) @Retention(RUNTIME) public @interface Constraint { /** * {@link ConstraintValidator} classes implementing the constraint. The given classes * must reference distinct target types for a given {@link ValidationTarget}. If two * {@code ConstraintValidator}s refer to the same type, an exception will occur. * <p> * At most one {@code ConstraintValidator} targeting the array of parameters of * methods or constructors (aka cross-parameter) is accepted. If two or more * are present, an exception will occur. * * @return array of {@code ConstraintValidator} classes implementing the constraint */ Class<? extends ConstraintValidator<?, ?>>[] validatedBy(); }
-
实现
ConstraintValidator
接口,重写isValid()
方法,实现自己的判断逻辑package com.codeup.mybatisjoin.validation; import lombok.extern.slf4j.Slf4j; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * @ProjectName: mybatisjoin * @Package: com.codeup.mybatisjoin.validation * @ClassName: StatusConstraintValidator * @Author: lhc * @Description: TODO * @Date: 2019/8/22 下午 3:38 */ @Slf4j public class StatusConstraintValidator implements ConstraintValidator<StatusConstraint,Object> { @Override public boolean isValid(Object value, ConstraintValidatorContext context) { String statCode = (String) value; // 等于1或2返回true,反之 if ("1".equals(statCode) || "2".equals(statCode)) { return true; } return false; } }
-
至此,对字段添加约束条件已完成。还存在一个重要的操作是对约束的校验,这里通过工具类实现
package com.codeup.mybatisjoin.validation; import org.hibernate.validator.HibernateValidator; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; /** * @ProjectName: mybatisjoin * @Package: com.codeup.mybatisjoin.validation * @ClassName: ValidatorConfig * @Author: lhc * @Description: TODO * @Date: 2019/8/22 下午 4:31 */ public class ValidatorUtil { /** * 配置hibernate_validator和快速失败模式 */ private static Validator validator = Validation.byProvider(HibernateValidator.class) .configure() .failFast(true) .buildValidatorFactory() .getValidator(); /** * 参数校验,若未匹配约束,则通过已将将之前定义的`message`抛出 * @param object 参数 * @param groups 属于组 */ public static void result(Object object, Class<?>... groups) { Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups); if (constraintViolations.size() > 0) { String message = constraintViolations.iterator().next().getMessage(); throw new MissingParameterException(message); } } }
-
将message信息抛出之后,需要以更统一的方式返回给第三方,使用统一异常处理机制解决
-
自定义异常类MissingParameterException
package com.codeup.mybatisjoin.validation; public class MissingParameterException extends RuntimeException { public MissingParameterException(String message) { super(message); } }
-
统一异常处理
package com.codeup.mybatisjoin.validation; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MissingParameterException.class) public Map<String, Object> invalidParameter(MissingParameterException e) { Map<String, Object> map = new HashMap<>(); map.put("code", 500); map.put("message", e.getMessage()); return map; } }
-
-
通过请求查看返回结果
package com.codeup.mybatisjoin.controller; import com.codeup.mybatisjoin.model.Brand; import com.codeup.mybatisjoin.validation.ValidatorUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.LinkedHashMap; import java.util.Map; @Slf4j @RestController @RequestMapping(value = "/brandConroller") public class BrandConroller { @PostMapping(value = "/go") public Map<String, Object> go(@RequestBody Brand brand) { ValidatorUtil.result(brand); Map<String, Object> map = new LinkedHashMap<>(); log.info("brand:{}", brand); return map; } }
-
请求
// request { "brandId": 1, "vendorId": 1, "brandName": "demoData", "description": "demoData", "status": "3" } // response { "code": 500, "message": "[status]为1或者2" }
如有不妥之处,请吐槽我
今天的关于Hibernate Validator,自定义ResourceBundleLocator和Spring和spring validation 自定义的分享已经结束,谢谢您的关注,如果想了解更多关于at org.apache.catalina.webresources.CachedResource.validateResources、hibernate 和 spring 整合:Unable to get the default Bean Validation factory、hibernate 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.i...、HibernateValidator自定义验证的相关知识,请在本站进行查询。
本文标签: