gpt4 book ai didi

jaxb2 - 如何使用 JAXB 对不同模式应用不同的自定义

转载 作者:行者123 更新时间:2023-12-02 22:28:22 26 4
gpt4 key购买 nike

在我们的 Maven 项目中,我们有一个文件夹,其中包含多个 xsd 和 xjb 文件。因此,我们使用 maven-jaxb2-plugin 应用 JAXB 自定义。

目前,我们有两个 xjb 文件应用于所有 xsd 1)GlobalBindings.xjb 2)ServiceSpecific.xjb。 ServiceSpecific.xjb 更多的是在某些特定元素上进行更精细的控制绑定(bind)。

下面是 GlobalBindings.xjb

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
jaxb:version="2.0"
jaxb:extensionBindingPrefixes="xjc annox">

<jaxb:globalBindings>
<xjc:javaType name="java.util.Date" xmlType="xs:dateTime" adapter="company.jaxb.adapter.DateTimeAdapter"/>
</jaxb:globalBindings>
</jaxb:bindings>

通过这种方法,我在生成的对象中的 xs:dataTime 字段上获得了 @XmlJavaTypeAdapter(DateTimeAdapter.class) 注释。

但是,有一些模式,其 JAXB 对象需要具有不同版本的 DateTimeAdapter.class,例如 DateTimeAdapter1.class。

我计划通过将这些特定的 xsd 分离到一个单独的文件夹中并将其与那些特定的 xjb 配对来实现此目的,这通过新的执行步骤在 maven 插件中提供了不同的 DateTimeAdapter1 。类似下面的内容

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>specific</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory
<bindingDirectory>${basedir}/src/main/resources/xsd</bindingDirectory>
<generatePackage>company.service.generated</generatePackage>
......................

......................
<includeSchemas>
<includeSchema>**/specific.xsd</includeSchema>
</includeSchemas>

但是想知道,在不经历这个麻烦的情况下,是否有更好的方法在 servicespec.xjb 中的单个架构级别进行自定义,例如

<jaxb:bindings schemaLocation="specific.xsd" multiple="true">
<jaxb:bindings node="xs:complexType/xs:sequence/xs:element[@type='xs:dateTime']"
multiple="true">

<jaxb:globalBindings>
<xjc:javaType name="java.util.Date" xmlType="xs:dateTime" adapter="company.jaxb.adapter.DateTimeAdapter1"/>
</jaxb:globalBindings>
</jaxb:bindings>
</jaxb:bindings>

我尝试了上述方法,但是在生成时,maven 失败并显示错误消息

“编译器无法支持此 globalBindings 自定义。它附加到错误的位置,或者与其他绑定(bind)不一致。”

所以,显然我在这里尝试做的事情是不正确的。除了更改 pom 之外,我还有什么选择(即对一组文件使用不同的执行方式,这需要花费很多时间来重新排列 XSD)

谢谢

最佳答案

的作者在这里。

我认为没有更好的方法了。全局绑定(bind)是全局的。因此,如果您想要不同模式子集上的不同全局绑定(bind),则必须单独编译它们。就像你一样。

不过,您不必重新排列架构。您可以配置不同的架构目录或模式或单个文件。

关于jaxb2 - 如何使用 JAXB 对不同模式应用不同的自定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28500649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com