在由Java JAXB注释类生成的模式中生成XSD限制

时间:2015-09-04 17:00:09

标签: java xsd jaxb moxy

MOXy BeanValidation使我能够为我的JAXB类添加验证。

使用MOXy的“Bean Validation插件”我可以在生成的JAXB类中使用来自 prexisting 架构的restrictions/facets进行Bean验证。

然而,基于来自JAXB注释的java类的Bean验证注释使用restrictions/facets生成模式的方法是什么?

XJC在执行'schema first'生成java时有一个方便的插件架构,但有没有任何等效的'java first'方法来增强生成的XSD带有额外的限制,甚至添加XML注释?在MOXy或JAXB-RI中?

MOXy非常灵活,可以在中间映射中使用,可以在模式生成期间使用吗?

jaxb-facets project似乎做了我想要的但是实现者必须分叉一个全新的JAXB-RI才能进入它,似乎它不会很快被采用。({{3} })

我尝试了@ m0mus指定的分辨率,但必须使用sonatype存储库中的2.7.0-SNAPSHOT版本。我还有几个问题; 1.我必须用@XmlElement注释java字段以使facet出现在xsd中。 @XmlAttribute,@ XmlAccessorType(XmlAccessType.FIELD)没有任何区别。 @Pattern没有用;我不得不在Pattern.List;

中使用单个Pattern
@XmlElement
@Pattern.List(value = { @Pattern(regexp="[0-9]*") })
public String phoneNumber2;

有关详细信息,请参阅See this Java JIRA

3 个答案:

答案 0 :(得分:3)

提交了有关处理_timer.Stop(); 字段的增强请求:Bugs Page

您需要使用v2.7的原因是,在一些用于模式生成的异常调用树中,enable facets属性值不会在调用树下传播。 5月5日是fixed。被要求退回EL v2.6 now

答案 1 :(得分:2)

我认为它就在那里。 MOXy使用自己的SchemaGen实现来处理从Java类生成XSD文件的过程。 SchemaGen已扩展为基于Java类上的BV注释自动生成XSD限制和构面。由于模式生成过程是在创建JAXBContext时发生的,因此可以通过在JAXBContext上设置以下属性(在JAXBContextProperties中找到)来打开/关闭BV增强功能:

/**
 * Property for disabling/enabling generation of XML Facets during schemagen.
 * The mapped value must be of type Boolean.
 * If it's true, then facets will be generated, based on the BV annotations.
 * If false, the BV annotations processing will be skipped during schemagen
 * and no facets will be generated.
 *
 * @since 2.6
 */
public static final String GENERATE_FACETS = "eclipselink.generate.facets";

SchemaGen识别BV API提供的注释,包括@ Pattern.List。如果SchemaGen遇到一个用@NotNull和@XmlElement(nillable = true)注释的字段,它将引发BeanValidationException.notNullAndNillable()。

样品:

Map props = new HashMap( );
props.put("eclipselink.beanvalidation.facets", true);
JAXBContext jc = JAXBContext.newInstance(classes, properties);
SchemaOutputResolver sor = new MSOR();
jc.generateSchema(sor);

答案 2 :(得分:-1)

您还可以使用xjc插件https://github.com/krasa/krasa-jaxb-tools

根据文档,它支持<name>DEV</name>并可以生成:

    对于所有复杂类型的
  • XJsr303Annotations批注,可以进一步限制为仅针对已定义架构的类型生成:@Valid
  • -XJsr303Annotations:targetNamespace=http://www.foo.com/bar注释,其值为@NotNull值> = 1的对象,或具有必需用途的属性
  • MinOccur用于具有@Size
  • 的列表
  • minOccurs > 1,如果有@SizemaxLength或长度限制
  • minLength限制@DecimalMax
  • maxInclusive限制@DecimalMin
  • minInclusive的{​​{1}}限制,使用以下参数启用新参数@DecimalMaxmaxExclusive
  • (inclusive=false)的{​​{1}}限制,使用以下参数启用新参数-XJsr303Annotations:JSR_349=true@DecimalMin
  • minExclusive,如果有(inclusive=false)-XJsr303Annotations:JSR_349=true限制。
  • @Digits(如果有totalDigits限制

如果您想知道如何在构建环境(fractionDigits@PatternPattern)中使用XJC插件,我建议您看一下另一个插件的示例:immutable-xjc < / p>

所以我希望对您有帮助。