簡體   English   中英

在由Java JAXB注釋類生成的模式中生成XSD限制

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

MOXy BeanValidation使我能夠為我的JAXB類添加驗證。

使用MOXy的“Bean Validation Plugin”我可以根據來自現有 Schema的限制/方面在生成的JAXB類中進行Bean Validation。

但是有沒有辦法根據來自JAXB注釋的java類的 Bean Validation注釋生成帶有限制/方面 的模式

XJC在執行'schema first'生成java時有一個方便的插件架構,但有沒有任何等效的'java first'方法來增強生成的XSD帶有額外的限制,甚至添加XML注釋? 在MOXy或JAXB-RI中?

MOXy非常靈活,可以在中間映射中使用,可以在模式生成期間使用嗎?

jaxb-facets項目似乎做了我想要的但是實現者不得不分叉一個全新的JAXB-RI來獲取它並且它似乎不會很快被采用。( 參見Java JIRA


我嘗試了@ 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;

有關更多信息,請參閱EclipseLink論壇

提交了一個增強處理@XMLAttribute字段的請求: Bugs Page

您需要使用v2.7的原因是,在一些用於模式生成的異常調用樹中,enable facets屬性值不會在調用樹下傳播。 它於5月5日修復 現在被要求退回EL v2.6。

我認為它就在那里。 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);

您還可以查看xjc插件https://github.com/krasa/krasa-jaxb-tools

通過文檔,它支持XJsr303Annotations並可以生成:

  • 所有復雜類型的@Valid注釋可以進一步限制為僅為定義的模式中的類型生成: -XJsr303Annotations:targetNamespace=http://www.foo.com/bar
  • @NotNull注釋具有MinOccur值> = 1的對象或具有所需用途的屬性
  • @Size表示minOccurs > 1列表
  • 如果存在maxLengthminLength或長度限制, @Size
  • @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

所以我希望它有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM