JavaSE或jaxb内部的JSR303bean验证
我接收xml并通过jaxb将其转换为bean。我需要验证xml,不想使用xsd或其他xml验证方法。我喜欢使用注释和bean验证方法。如何在JavaSE环境中验证bean?但最好的解决方案是在jaxb框架中实现JSR303验证 我最初将这个问题解释为“如何使JAXB模式派生类JSR303可验证”。在年的讨论之后,OP似乎提出了一个不同的问题。尽管如此,我还是会留下我的答案,因为我认为这可能会对其他通过关键字找到这个问题的人有所帮助 但这不是OP问题的答案,对此表示抱歉JavaSE或jaxb内部的JSR303bean验证,java,xml,validation,jaxb,bean-validation,Java,Xml,Validation,Jaxb,Bean Validation,我接收xml并通过jaxb将其转换为bean。我需要验证xml,不想使用xsd或其他xml验证方法。我喜欢使用注释和bean验证方法。如何在JavaSE环境中验证bean?但最好的解决方案是在jaxb框架中实现JSR303验证 我最初将这个问题解释为“如何使JAXB模式派生类JSR303可验证”。在年的讨论之后,OP似乎提出了一个不同的问题。尽管如此,我还是会留下我的答案,因为我认为这可能会对其他通过关键字找到这个问题的人有所帮助 但这不是OP问题的答案,对此表示抱歉 请参阅Jsr303Ann
请参阅
Jsr303Annotations
插件
生成:
- @所有复杂类型的有效注释可以进一步限制为仅为定义架构中的类型生成: -XJSR303注释:targetNamespace=
- @MinOccur值大于等于1的对象或具有所需用途的属性的NotNull注释
- @最小值大于1的列表的大小
- @如果存在maxLength或minLength或length限制,则为大小
- @maxInclusive限制的小数点最大值
- @最小包含限制的小数点
- @小数点最大值对于maxExclusive限制,使用:-XJsr303Annotations:JSR_349=true启用新参数(inclusive=false)
- @小数点对于minExclusive限制,使用:-XJsr303Annotations:JSR_349=true启用新参数(inclusive=false)
- @如果存在totalDigits或fractionDigits限制,则为数字
- @模式,如果存在模式限制
我无法理解如何运行krasa jaxb工具,我找到了另一个解决方案。它是hibernate验证程序 依赖项:
<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>
它并不漂亮,但很实用我也有类似的情况。 我使用Java7、Jax-RS(cxf)、Spring(core)在servlet容器(Tomcat7)中开发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);
}
MyPojo p=新的MyPojo(…);
//进行验证
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
Set constraintViolations=validator.validate(p);
if(constraintViolations.size()>0){
抛出新的ConstraintViolationException(constraintViolations);
}
我现在的理解是:
- 如果您有“托管bean”(通过Spring或实体管理器),其 生命周期由容器管理,则此容器将 注意执行验证
- 如果您只有pojo/非托管bean,那么您必须通过编程执行验证器:在某些上下文中,我想AOP可以用于执行此操作,并避免编写太多样板代码
菲利普好吧,那就不同了。对不起,这不明显。我已经更新了我的(非)答案以避免误解。
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);
}