JAXB生成不需要的@XMLValue

JAXB生成不需要的@XMLValue,jaxb,jaxb2,maven-jaxb2-plugin,Jaxb,Jaxb2,Maven Jaxb2 Plugin,我已经解决了一个问题大约半个星期了,需要帮助,因为我似乎无法取得任何进展 我继承了一个应用程序,它已经8年没有得到很好的处理了…仍然在Java1.4上,Maven1构建,8年没有新的单元测试 目前,升级到Java 1.6(Java 1.8分支也并行完成,将同时测试这两个分支)和Maven 3.3.3的工作进展顺利,取得了很好的进展 现在我遇到了困难,有一段时间没有取得突破 旧的源代码使用本地JAXB1.3 JAR从大型XSD生成类 我必须从JAXB1.3迁移到JAXB2.1,这也意味着随着命名约

我已经解决了一个问题大约半个星期了,需要帮助,因为我似乎无法取得任何进展

我继承了一个应用程序,它已经8年没有得到很好的处理了…仍然在Java1.4上,Maven1构建,8年没有新的单元测试

目前,升级到Java 1.6(Java 1.8分支也并行完成,将同时测试这两个分支)和Maven 3.3.3的工作进展顺利,取得了很好的进展

现在我遇到了困难,有一段时间没有取得突破

旧的源代码使用本地JAXB1.3 JAR从大型XSD生成类

我必须从JAXB1.3迁移到JAXB2.1,这也意味着随着命名约定的改变,我必须花费大量时间重写对生成类的所有引用。 无论如何,我们花了很多时间来编译代码

最后,它进行了编译,我尝试了一个单元测试,看看它是如何工作的。 这就是我的问题所在

大多数编译的类都可以正常工作,但当我尝试生成JAXBContext时,有三个包抛出异常:

@在派生另一个类的类上不允许使用XmlValue

我已经将问题缩小到一个模式,该模式发生在几个生成的类中。 导致异常的类在架构中定义如下:

    <xs:element name="ContactName">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="First" type="xs:string"/>
                <xs:attribute name="Middle" type="xs:string"/>
                <xs:attribute name="Last" type="xs:string"/>
                <xs:attribute name="Name" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>
然后在ContactInfo中声明如下:

<xs:element name="ContactInfo">
    <xs:complexType>
        <xs:annotation>
            <xs:documentation>Common contact information</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element ref="ContactName" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="ContactID" minOccurs="0"/>
            <xs:element ref="ContactDivision" minOccurs="0" maxOccurs="unbounded"/>
            .....
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "contactName",
    "contactID",
    "contactDivision",
    "contactPhone",
    "contactPhoneHome",
    "contactPhoneMobile",
    "contactFax",
    "contactEmail",
    "contactEmail2"
})
@XmlRootElement(name = "ContactInfo")
public class ContactInfo
    extends BaseJaxbDoc
    implements Serializable, Cloneable, CopyTo
{

    private final static long serialVersionUID = 47110815L;
    @XmlElement(name = "ContactName")
    protected List<ContactName> contactName;
原始模式上有一个XML转换,剥离注释并创建jaxb:typesafeEnum类型。然后将转换后的模式与jxb绑定文件一起使用,以将所有内容绑定到内部jaxb辅助超类BaseJaxbDoc

        <jaxb:globalBindings generateIsSetMethod="true">
        <xjc:serializable uid="47110815"/>
        <xjc:superClass name="xxx.xx.xxxx.xxxx.helpers.BaseJaxbDoc"/>
        <jaxb:javaType name="java.math.BigDecimal" xmlType="xs:decimal" 
             parseMethod="xxx.xx.xxxx.xxxx.helpers.AmountConverter.parseAmount" 
            printMethod="xxx.xx.xxxx.xxxx.helpers.AmountConverter.printAmount"/>
        </jaxb:globalBindings>

这是因为我在9个不同的模式上使用xjc,所有这些模式都生成类的JAXB包

这些类都具有相同的超类(在每个模式的绑定文件中定义),只实现一次JAXB marshall/unmarshall类,以及其他一些辅助函数。 所以我的问题是,当我无法修改模式时,如何避开这个异常? XSLT中的内容还是绑定文件中的内容

我的Maven依赖项: 对于JAXB: org.jvnet.jaxb2.maven2 maven-jaxb21-plugin 0.13.0

JAXB运行时: org.glassfish.jaxb jaxb运行时 2.2.11

尝试使用
@xmltransive
注释
BaseJaxbDoc

您遇到的问题是:

JAXB认为您的
BaseJaxbDoc
是一个基类。因此,您应该删除
xjc:superClass
,或者诱使JAXB认为您的类没有基类

当我在
ModelBuilder
中查看时:

        if(reader.hasClassAnnotation(clazz,XmlTransient.class) || isReplaced) {
            // handle it as if the base class was specified
            r = getClassInfo( nav.getSuperClass(clazz), searchForSuperClass,
                    new ClassLocatable<C>(upstream,clazz,nav) );
        }
if(reader.hasClassAnnotation(clazz,xmltransive.class)| |被替换){
//像指定基类一样处理它
r=getClassInfo(导航getSuperClass(clazz),searchForSuperClass,
新的分类定位(上游、分类、导航);
}
<>看起来,<代码> ModelBuilder <代码>在类中识别<代码> @ xMListTime/Cuff>,而不考虑它们。因此,在
BaseJaxbDoc
上分配
@xmltransive
可能会有所帮助

另一个选项是删除
BaseJaxbDoc
construct。您可以使用类继承将封送/解组功能添加到模式派生类中。我宁愿将此功能转移到一些外部服务中。这可能不是一个选项,因为您可能面临许多遗留代码


另一种选择是在运行时尝试MOXy而不是JAXB-RI。

如何以及为什么生成extends-BaseJaxbDoc?如果你删除了它是否有效?谢谢你的回复,我会更新这个问题来添加这个信息。原始模式上有一个XML转换,剥离注释并创建jaxb:typesafeEnum类型。然后将转换后的模式与jxb绑定文件一起使用,将所有内容绑定到一个内部jaxb助手超类BaseJaxbDoc。这是因为我在9个不同的模式上使用xjc,所有这些模式都生成类的jaxb包。这些类都有相同的超类(在每个模式的绑定文件中定义),只实现一次JAXB marshall/unmarshall类,以及其他一些帮助函数。再次感谢您花时间帮助我!不幸的是,XMLTransient没有起到任何作用——由于BaseJaxbDoc类中的属性,我最终遇到了更多的异常。我很想放弃这个基类,但正如你所说的,它需要大量的返工。理想情况下,在重新设计之前,我会在更新的构建环境中运行所有内容。我将给MOXy实现另一次尝试——它需要Java 1.7+才能运行,因此我将看到一些对该实现的引用,我确实尝试过,但在出现更多异常时放弃了。我决定看看是否可以破解@XMLValue one。MOXy异常:javax.xml.bind.JAXBException:Provider org.eclipse.persistence.jaxb.JAXBContextFactory无法实例化:javax.xml.bind.JAXBException:异常描述:属性或字段值不能用XMLValue注释,因为它是另一个属性的子类XML绑定类带链接异常:[exception[EclipseLink-50011](Eclipse持久性服务-2.6.1.v20150605-31e8258):org.Eclipse.Persistence.exceptions.jaxBeException异常说明:属性或字段值不能用XmlValue注释,因为它是另一个绑定XML的类的子类。]看起来我别无选择,只能在没有BaseJaxbDoc的情况下返工模块。。。。感谢所有的帮助,在摆脱BaseJaxbDoc之前,我将花一些时间研究一下MOXy实现。好的……我还尝试从绑定文件中删除XJC:superclass绑定,它已经停止了运行时抛出的异常。。。所以非常感谢!你给我看了
        <jaxb:globalBindings generateIsSetMethod="true">
        <xjc:serializable uid="47110815"/>
        <xjc:superClass name="xxx.xx.xxxx.xxxx.helpers.BaseJaxbDoc"/>
        <jaxb:javaType name="java.math.BigDecimal" xmlType="xs:decimal" 
             parseMethod="xxx.xx.xxxx.xxxx.helpers.AmountConverter.parseAmount" 
            printMethod="xxx.xx.xxxx.xxxx.helpers.AmountConverter.printAmount"/>
        </jaxb:globalBindings>
                if(getBaseClass()!=null) {
                    builder.reportError(new IllegalAnnotationException(
                        Messages.XMLVALUE_IN_DERIVED_TYPE.format(), p ));
                }
        if(reader.hasClassAnnotation(clazz,XmlTransient.class) || isReplaced) {
            // handle it as if the base class was specified
            r = getClassInfo( nav.getSuperClass(clazz), searchForSuperClass,
                    new ClassLocatable<C>(upstream,clazz,nav) );
        }