www.91084.com

GVKun编程网logo

Hibernate Validator,自定义ResourceBundleLocator和Spring(spring validation 自定义)

21

本文将为您提供关于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 自定义)

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

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

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...

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自定义验证

前言

在自己的摸索下对HibernateValidator有了初步的认识,可以使用已有的约束条件对字段做出限制,减少不要代码的出现,使代码更简洁。
但在最近的实际使用中,出现了一些无法使用框架处理的问题,例如,在第三方请求我的接口时,根据status字段区分不同的业务逻辑;status=1进行A逻辑处理,status=2进行B逻辑处理;在网络了检索了相关信息后,做出如下总结。

步骤

  1. 使用通用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;
    }
  2. @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 {};
    }
  3. 通过查看源代码里面的文档得知要要实现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();
    }
  4. 实现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;
        }
    }
  5. 至此,对字段添加约束条件已完成。还存在一个重要的操作是对约束的校验,这里通过工具类实现

    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);
            }
        }
    }
  6. 将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;
        }
    }
  1. 请求

    // request
     {
        "brandId": 1,
        "vendorId": 1,
        "brandName": "demoData",
        "description": "demoData",
           "status": "3"
    }
    // response
    {
        "code": 500,
        "message": "[status]为1或者2"
    }

如有不妥之处,请吐槽我

今天的关于Hibernate Validator,自定义ResourceBundleLocator和Springspring 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自定义验证的相关知识,请在本站进行查询。

本文标签: