【发布时间】: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
我收到 xml 并通过 jaxb 将其转换为 bean。我需要验证 xml,我不想使用 xsd 或其他 xml 验证方法。我喜欢使用注解和 bean 验证方法。如何在 java se 环境中验证 bean?但最好的解决方案是在 jaxb 框架中实现 JSR 303 验证
【问题讨论】:
标签: java xml validation jaxb bean-validation
我无法理解如何运行 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
它不漂亮,但它很有效
【讨论】:
更新
我最初将这个问题解释为“如何使 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 如果存在模式限制
【讨论】:
我也有类似的情况。 我在 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);
}
我现在的理解是:
如果有人能确认我的理解或在我错了时纠正我,我将不胜感激
谢谢
菲利普
【讨论】: