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

在由javajaxb注释类生成的模式中生成XSD限制,java,xsd,jaxb,moxy,Java,Xsd,Jaxb,Moxy,MOXy使我能够向JAXB类添加验证 使用MOXy的“Bean验证插件”,我可以在基于预先存在的模式生成的JAXB类中进行Bean验证 然而,有没有任何方法可以从JAXB注释的java类生成基于Bean验证注释的模式 在“模式优先”生成java时,XJC有一个方便的插件体系结构,但是是否有任何等效的“java优先”方法来增强生成的XSD并增加额外的限制,甚至添加XML注释?在MOXy或JAXB-RI中 MOXY在中间映射中是非常灵活的,在模式生成过程中可以使用吗? 这似乎是我想要的,但实现者必

MOXy使我能够向JAXB类添加验证

使用MOXy的“Bean验证插件”,我可以在基于预先存在的模式生成的JAXB类中进行Bean验证

然而,有没有任何方法可以从JAXB注释的java类生成基于Bean验证注释的模式

在“模式优先”生成java时,XJC有一个方便的插件体系结构,但是是否有任何等效的“java优先”方法来增强生成的XSD并增加额外的限制,甚至添加XML注释?在MOXy或JAXB-RI中

MOXY在中间映射中是非常灵活的,在模式生成过程中可以使用吗? 这似乎是我想要的,但实现者必须拿出一个全新的JAXB-RI来实现它,而且它似乎不会很快被采用


我尝试了@m0mus指定的分辨率,但不得不使用sonatype存储库中的2.7.0-SNAPSHOT版本。我仍然有一些问题; 1.我必须用@XmlElement注释java字段,以使facet显示在xsd中@XmlAttribute、@XmlAccessorType(XmlAccessType.FIELD)没有区别@模式不起作用;我必须在Pattern.List中使用单个模式

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

有关更多信息,请参见我想它就在那里。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);

提交了增强请求以处理
@xmltattribute
字段:


您需要使用v2.7的原因是,在一些不寻常的模式生成调用树中,enable facets属性值没有向下传播到调用树。那是5月5日。要求提供ELV2.6的后端口。

您也可以查看xjc插件

通过文档,它支持
xjsr303注释
,并可以生成:

  • @Valid
    注释适用于所有复杂类型,可以进一步限制为仅为定义架构中的类型生成:
    -XJsr303Annotations:targetNamespace=http://www.foo.com/bar
  • @NotNull
    注释,用于具有
    minocur
    值>=1的对象或具有所需用途的属性
  • @Size
    用于具有
    minOccurs>1
  • @Size
    如果存在
    maxLength
    minLength
    或长度限制
  • @DecimalMax
    用于
    maxInclusive
    限制
  • @DecimalMin
    用于
    minInclusive
    限制
  • @DecimalMax
    对于
    maxExclusive
    限制,启用新参数
    (inclusive=false)
    ,并使用:
    -xjsr303注释:JSR_349=true
  • @DecimalMin
    对于
    minExclusive
    限制,启用新参数
    (inclusive=false)
    ,带有:
    -xjsr303注释:JSR_349=true
  • @Digits
    如果存在
    totalDigits
    fractionDigits
    限制
  • @Pattern
    如果存在
    模式
    限制
如果您想知道如何在构建环境中使用XJC插件(
ant
maven
gradle
),我可以重新编译另一个插件的示例:


因此,我希望这能有所帮助。

请参阅水平线规则下方的相关评论;目前不支持@XmlAttribute和@XmlAccessorType(XmlAccessType.FIELD)。请不要只是发布一些工具或库作为答案。至少在答案本身上加以说明,我希望将答案扩展到更具代表性的具体问题上。