java SE或jaxb中的JSR 303 Bean验证

时间:2014-11-14 14:05:40

标签: java xml validation jaxb bean-validation

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

3 个答案:

答案 0 :(得分:2)

<强>更新

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

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


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

  

生成:

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

答案 1 :(得分:2)

我无法理解如何运行krasa-jaxb-tools,我找到了另一种解决方案。它是hibernate-validator 依赖关系:

    <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 :(得分:0)

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

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

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

所以,MyPojo就像是:

@MyPojoConstraint
public class MyPojo {

// members

// getters/setters
}

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

但什么都没发生。我尝试使用@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);
}

我现在的理解是:

  • 如果你有&#34;托管豆&#34; (通过Spring或实体经理) 生命周期由容器管理,然后此容器将采用 关心执行验证
  • 如果你只有pojo / unmanaged bean,你必须以编程方式执行验证器:在某些上下文中,我猜AOP可以用来做这个并避免编写太多的样板代码

如果有人能够证实我的理解,或者如果我错了,我会非常感激

由于

菲利普