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

Generation of XSD restrictions in a schema generated from Java JAXB annotated classes

MOXy BeanValidation 让我能够向我的 JAXB classes 添加验证。

使用 MOXy 的 "Bean Validation Plugin" 我可以在基于 prexisting 模式的 restrictions/facets 生成的 JAXB classes 中进行 Bean 验证。

然而,有没有什么方法可以生成一个模式restrictions/facets基于 Bean 验证注释从一个 JAXB 注释 javaclass?

XJC 在 'schema first' 生成 java 时有一个方便的插件架构,但是是否有任何等效的 'java first' 方法来增强生成的 XSD 附加限制,或者甚至添加 XML 评论?在 MOXy 或 JAXB-RI 中?

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

jaxb-facets project seems to do what I want but the implementer had to fork an entire new JAXB-RI to get it in and it seems that it won't be adopted any time soon.(See this Java JIRA)


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

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

有关详细信息,请参阅 EclipseLink Forum

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

/**
 * 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);

提出了增强处理 @XMLAttribute 字段的请求:Bugs Page

您需要使用 v2.7 的原因是,在一些用于模式生成的异常调用树中,enable facets 属性 值不会沿着调用树传播。这是 fixed on May 5th. Asked for backport to EL v2.6 now

你也可以看看xjc插件https://github.com/krasa/krasa-jaxb-tools

根据文档,它支持 XJsr303Annotations 并且可以生成:

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

如果您想知道如何在构建环境中使用 XJC 插件(antmavengradle),我可能会推荐您查看另一个插件的示例:immutable-xjc

希望对您有所帮助。