当前位置: 首页 > 知识库问答 >
问题:

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

郭思淼
2023-03-14

MOXy BeanValide使我能够将验证添加到我的JAXB类中。

使用MOXy的“Bean Validation Plugin”,我可以根据预先存在的模式中的限制/方面在生成的JAXB类中进行Bean验证。

但是,有没有任何方法可以基于JAXB注释的java类的Bean验证注释生成带有限制/facetsb的模式?

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

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

jaxb facets项目似乎做了我想要做的事情,但实现者必须拿出一个全新的jaxb-RI来实现它,而且它似乎不会很快被采用。(请参阅此Java JIRA)

我尝试了@m0mus指定的分辨率,但不得不使用sonatype存储库中的2.7.0-SNAPSHOT版本。我仍然有几个问题;1.我必须用@XmlElement注释java字段,以使方面出现在xsd中。@xmlAccessorType(XmlAccessType.FIELD)没有区别。@Pattern不起作用;我必须在Pattern中使用单个Pattern。列表;

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

有关更多信息,请参阅Eclipse Link论坛

共有3个答案

易修洁
2023-03-14

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

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

  • @Valid注释适用于所有复杂类型,可以进一步限制为仅为定义架构中的类型生成:-XJsr303Annotations:targetNamespace=http://www.foo.com/bar

如果您想知道如何在构建环境中使用XJC插件(antmavengradle),我可以重新编译另一个插件的示例:不可变XJC

所以我希望这能有所帮助。

公良泰宁
2023-03-14

我想它在那里。MOXy使用自己的SchemaGen实现从Java类生成XSD文件的过程。SchemaGen被扩展为基于Java类上的BV注释自动生成XSD限制和Facets。由于模式生成过程是在创建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。列表如果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);
贺聪
2023-03-14

提交了一个增强请求,以处理@XML属性字段:Bugs Page

您需要使用v2.7的原因是,在一些不寻常的模式生成调用树中,使能方面属性值不会向下传播到调用树中。它被固定在5月5日。现在要求Backport到EL v2.6。

 类似资料:
  • 手工编写类和从scheme生成JAXB类的优缺点是什么。我开始新的项目,并希望了解如何选择避免陷阱。 我有复杂的XML结构(基本上是FreeSwitch配置定义),包括不同XML级别上的可重复类型。

  • 问题内容: 我已经使用JAXB编写了许多类进行序列化,并且我想知道是否存在一种基于注释为每个对象生成XSD文件的方法。有这个工具吗? 喜欢的东西是 真棒 。有什么可以做的吗? 问题答案: 是的,您可以在JAXBContext上使用该方法: 您可以利用实现控制输出的位置:

  • JAXB为每个属性生成@XmlAttribute注释。例如,属性 转换为带注释的java对象属性 但是,如果属性在名称中没有下划线,则@Xml属性中的名称字段丢失(因此##默认)。我想自定义JAXB绑定,以便也生成没有下划线的名称的注释。有什么建议吗? 谢谢!Johannes

  • 我一直在使用 annox 在我的 jaxb 生成的类上添加注释(通过绑定文件),但我找不到直接在包上添加注释的方法(包信息.java)。 我一直在尝试在bindings.xml中这样做: 但是jaxb抱怨说< code>annox:annotate不应该在那里。 还有别的方法吗?

  • 问题内容: 我们的项目使用XJC从XSD生成Java类。我正在使用JAVA EE 6。 当我们所有的XSD重新生成时,生成的类在文件顶部包含以下注释: 是否可以取消此评论?原因是我们使用SVN进行版本控制,并且每次重新生成类时,每个单独的文件都显示为已在SVN中进行了更改,即使唯一的区别是此注释。因此,如果可能的话,我想完全删除该评论。 有一个指令,但是我不想删除整个标头,以使子孙后代知道它是从工

  • 我正在使用swagger 2和open api 5.3.1生成器生成一些类。目前,它似乎没有在Long(swagger中定义为int64)上生成模式注释。我该怎么做? 昂首阔步: 生成的代码