JAXB(Moxy)XML元数据映射问题

JAXB(Moxy)XML元数据映射问题,jaxb,eclipselink,moxy,Jaxb,Eclipselink,Moxy,我试图使用Moxy的XML元数据扩展映射下面的接口。但是当我尝试加载它时,我得到了下面的错误。我无法将公共构造函数添加到AddressType,因为它是一个枚举 我的问题是:尽管我没有在xml元数据中指定,为什么Moxy impl仍在查看AddressType public interface TokenizedUnitedStatesAddress { class AddressType extends Enum { public static final Ad

我试图使用Moxy的XML元数据扩展映射下面的接口。但是当我尝试加载它时,我得到了下面的错误。我无法将公共构造函数添加到
AddressType
,因为它是一个枚举

我的问题是:尽管我没有在xml元数据中指定,为什么Moxy impl仍在查看
AddressType

public interface TokenizedUnitedStatesAddress
{
    class AddressType extends Enum
    {
        public static final AddressType STREET = new AddressType("street");    
        public static final AddressType PO_BOX = new AddressType("poBox");    
        public static final AddressType RURAL_ROUTE = new AddressType("ruralRoute");

        public static AddressType getEnum(final String type)
        {
            return (AddressType) getEnum(AddressType.class, type);
        }

        protected AddressType(final String name)
        {
            super(name);
        }
    }

    String getApartmentNumber();

    //removed other getters for brevity
}



javax.xml.bind.JAXBException:
异常说明:类com.abc.ic.domain.country.us.TokenizedUnitedStatesAddress$AddressType需要零参数构造函数或指定的工厂方法。请注意,非静态内部类没有零参数构造函数,因此不受支持。
-除此之外:
[异常[EclipseLink-50001](Eclipse持久性服务-2.4.0.v20120608-r11652):org.Eclipse.Persistence.exceptions.jaxbeexception
异常说明:类com.abc.ic.domain.country.us.TokenizedUnitedStatesAddress$AddressType需要零参数构造函数或指定的工厂方法。请注意,非静态内部类没有零参数构造函数,因此不受支持。]
位于org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:908)
位于org.eclipse.persistence.jaxb.JAXBContext.(JAXBContext.java:157)
位于org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:170)
位于org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:157)
位于org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:117)
位于org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:107)

Mxoy impl仍然会对类进行内省,即使使用XML提供元数据。这是因为,根据设计,外部映射文件用于扩充注释提供的元数据

然而,问题是commons land Enum抽象要求我们为Enum提供一个非公共的单参数构造函数。我通过添加一个初始化默认枚举的公共无参数构造函数修复了这个问题。这就足够我申请了。然而,我已经创建了一个可以跟踪的bug


注意:我也研究了,但是它需要一个空的arg方法作为工厂方法,这在Enum中不是这样的。

我是EclipseLink MOXy团队的开发人员,我一直在研究这个问题。关于AddressType类被内省的原因,您是正确的,我发现您有一个解决方法

另一个解决方案是创建一个XmlAdapter,它可以在Apache枚举类及其XML(字符串)表示形式之间进行转换,如下所示:

import javax.xml.bind.annotation.adapters.XmlAdapter;

import org.apache.commons.lang.enums.Enum;

import enumbindings.TokenizedUnitedStatesAddress.AddressType;

public class ApacheEnumAdapter extends XmlAdapter<String, Enum> {

    public ApacheEnumAdapter() {
    }

    @Override
    public Enum unmarshal(String s) throws Exception {
        return AddressType.getEnum(s);
    }

    @Override
    public String marshal(Enum e) throws Exception {
        if (null == e) {
            return null;
        }
        return e.getName();
    }

}
import javax.xml.bind.annotation.adapters.XmlAdapter;
导入org.apache.commons.lang.enums.Enum;
导入enumbindings.TokenizedUnitedStatesAddress.AddressType;
公共类ApacheNumaDapter扩展了XmlAdapter{
公共公寓{
}
@凌驾
公共枚举解组(字符串s)引发异常{
返回AddressType.getEnum;
}
@凌驾
公共字符串封送处理(枚举e)引发异常{
如果(null==e){
返回null;
}
返回e.getName();
}
}
然后在绑定文件中连接适配器,如下所示:

...
<xml-element name="StreetType" java-attribute="streetType">
    <xml-java-type-adapter value="enumbindings.ApacheEnumAdapter" />
</xml-element>
...
。。。
...
就您输入的bug而言,EclipseLink实际上在这种情况下运行正常,我们没有对Apache Commons类进行任何特殊处理,因此仍然需要默认的无参数构造函数(或其他一些处理机制)。不过,我将更新您的bug并将其更改为增强请求,以支持Apache Enums开箱即用,我们将对其进行评估

谢谢


Rick

这可能是一个bug,您可以在以下位置输入一个:““Mxoy Impl自省类,即使XML被用于提供元数据”-这是正确的bug摘要吗?另外,如果你能解释一下这个问题的答案,那就太好了。另外,如果你能提供我应该查看的类,我可以为你修复这个错误。外部映射文件用于增加注释提供的元数据。它也可以用来完全替换它(请参阅)。似乎MOXy正在尝试将枚举作为域类进行处理。org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor`可能是罪魁祸首。如果您希望提交任何补丁,我们将不胜感激。我希望我现在能提供更多的帮助,但我要出城了。你也可以发布到EclipseLink论坛:ok。但是AddressType不是Java5Enum。这是一个从commons-lang.Thx中提取枚举的信息。你也可以看看这个,让我知道,如果我需要创建一个错误为这个。
import javax.xml.bind.annotation.adapters.XmlAdapter;

import org.apache.commons.lang.enums.Enum;

import enumbindings.TokenizedUnitedStatesAddress.AddressType;

public class ApacheEnumAdapter extends XmlAdapter<String, Enum> {

    public ApacheEnumAdapter() {
    }

    @Override
    public Enum unmarshal(String s) throws Exception {
        return AddressType.getEnum(s);
    }

    @Override
    public String marshal(Enum e) throws Exception {
        if (null == e) {
            return null;
        }
        return e.getName();
    }

}
...
<xml-element name="StreetType" java-attribute="streetType">
    <xml-java-type-adapter value="enumbindings.ApacheEnumAdapter" />
</xml-element>
...