在从 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
如果有 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
如果有 Pattern
限制
如果您想知道如何在构建环境中使用 XJC 插件(ant
、maven
、gradle
),我可能会推荐您查看另一个插件的示例:immutable-xjc
希望对您有所帮助。
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
如果有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
如果有Pattern
限制
如果您想知道如何在构建环境中使用 XJC 插件(ant
、maven
、gradle
),我可能会推荐您查看另一个插件的示例:immutable-xjc
希望对您有所帮助。