【问题标题】:JSR 303 Bean Validation in java SE or inside jaxbJava SE 或 jaxb 中的 JSR 303 Bean 验证
【发布时间】:2015-01-11 22:49:02
【问题描述】:

我收到 xml 并通过 jaxb 将其转换为 bean。我需要验证 xml,我不想使用 xsd 或其他 xml 验证方法。我喜欢使用注解和 bean 验证方法。如何在 java se 环境中验证 bean?但最好的解决方案是在 jaxb 框架中实现 JSR 303 验证

【问题讨论】:

    标签: java xml validation jaxb bean-validation


    【解决方案1】:

    我无法理解如何运行 krasa-jaxb-tools,我找到了另一个解决方案。它是休眠验证器 依赖:

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>javax.el</artifactId>
            <version>2.2.4</version>
        </dependency>
    

    和java代码:

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    x = validator.validate(bean).size(); // x=0 good; x!=0 bad
    

    它不漂亮,但它很有效

    【讨论】:

    • 好吧,那就另当别论了。这不明显,抱歉。
    • 我已经更新了我的(非)答案以避免误解。
    【解决方案2】:

    更新

    我最初将这个问题解释为“如何使 JAXB 模式派生类 JSR 303 可验证”。在讨论之后,OP出现了一个不同的问题。不过,我会留下我的答案,因为我认为这可能对通过关键字找到此问题的其他人有所帮助。

    但这不是 OP 问题的答案,对此感到抱歉。


    请参阅krasa-jaxb-tools Jsr303Annotations 插件。

    生成:

    • @Valid 注解适用于所有复杂类型,可以进一步限制为仅针对已定义模式中的类型生成: -XJsr303Annotations:targetNamespace=http://www.foo.com/bar
    • @NotNull 注释用于具有 MinOccur 值 >= 1 的对象或需要使用的属性
    • @Size 用于 minOccurs > 1 的列表
    • @Size 如果存在 maxLength 或 minLength 或长度限制
    • @DecimalMax 用于 maxInclusive 限制
    • @DecimalMin 用于 minInclusive 限制
    • @DecimalMax 用于 maxExclusive 限制,启用新参数(inclusive=false):-XJsr303Annotations:JSR_349=true
    • @DecimalMin 用于 minExclusive 限制,启用新参数(inclusive=false):-XJsr303Annotations:JSR_349=true
    • @Digits 如果有 totalDigits 或 fractionDigits 限制。
    • @Pattern 如果存在模式限制

    【讨论】:

      【解决方案3】:

      我也有类似的情况。 我在 servlet 容器 (Tomcat 7) 中使用 Java 7、Jax-RS (cxf)、Spring (core) 开发 REST 服务。 我没有持久层(它是一个基于 Lucene/Solr 的搜索后端),我不使用任何托管环境(除了 Spring for DI)。

      我有一个 pojo 类 (MyPojo),我创建了一个约束 (MyPojoConstraint) 及其底层验证器 (MyPojoValidator)。

      注意:pojo 实例不是通过 Spring 创建的 注意:约束是类级别的约束

      所以,MyPojo 有点像:

      @MyPojoConstraint
      public class MyPojo {
      
      // members
      
      // getters/setters
      }
      

      一开始,我认为添加@MyPojoConstraint 注释就足够/神奇了(即在创建类的实例时,将完成验证)。

      但是什么也没发生。我尝试使用 @Valid 注释,在构造函数上使用它。但它不起作用。

      我最终写了这样的代码:

      MyPojo p = new MyPojo(....);
      
      // Proceed to validation
      ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
      Validator validator = factory.getValidator();
      Set<ConstraintViolation<SuggestMRRequestParameters>> constraintViolations = validator.validate(p);
      if(constraintViolations.size() > 0){
                  throw new ConstraintViolationException(constraintViolations);
      }
      

      我现在的理解是:

      • 如果您有“托管 bean”(通过 Spring 或实体管理器),其 生命周期由一个容器管理,那么这个容器将占用 小心执行验证
      • 如果您只有 pojo / 非托管 bean,则必须以编程方式执行验证器:在某些情况下,我猜 AOP 可能有用,可以避免编写过多样板代码

      如果有人能确认我的理解或在我错了时纠正我,我将不胜感激

      谢谢

      菲利普

      【讨论】:

        猜你喜欢
        • 2015-01-10
        • 2011-07-24
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 2011-01-31
        • 2016-06-21
        • 2012-05-12
        相关资源
        最近更新 更多