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

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

赫连照
2023-03-14

我正在尝试使用MOXY的XML元数据扩展映射下面的接口。但当我尝试加载它时,我得到以下错误。我不能将公共构造函数添加到AddressType中,因为它是枚举。

我的问题是:为什么Moxy impl在xml元数据中没有指定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
}
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/oxm http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_4.xsd"
   version="2.4" package-name="com.abc.ic.domain.country.us">
   <java-types>
      <java-type name="TokenizedUnitedStatesAddress">
         <xml-root-element />
         <xml-type
            prop-order="StreetPreDirection StreetNumber StreetName StreetType StreetPostDirection UnitDesignator UnitNumber AddressLine1 AddressLine2 City State PostalCode CarrierRoute LengthAtAddress OwnershipStatus" />
         <java-attributes>
            <xml-element name="StreetPreDirection" java-attribute="preDirectional" />
            <xml-element name="StreetNumber" java-attribute="houseNumber" />
            <xml-element name="StreetName" java-attribute="streetName" />
            <xml-element name="StreetType" java-attribute="streetType" />
            <xml-element name="StreetPostDirection" java-attribute="postDirection" />
            <xml-element name="UnitNumber" java-attribute="apartmentNumber" />
            <xml-element name="AddressLine1" java-attribute="primaryAddress" />
            <xml-element name="AddressLine2" java-attribute="secondaryAddress" />
            <xml-element name="City" java-attribute="cityName" />
            <xml-element name="State" java-attribute="stateAbbreviation" />
            <xml-element name="PostalCode" java-attribute="zipCode" />
         </java-attributes>
      </java-type>
   </java-types>
</xml-bindings>
javax.xml.bind.JAXBException: 
Exception Description: The class com.abc.ic.domain.country.us.TokenizedUnitedStatesAddress$AddressType requires a zero argument constructor or a specified factory method.  Note that non-static inner classes do not have zero argument constructors and are not supported.
 - with linked exception:
[Exception [EclipseLink-50001] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.JAXBException
Exception Description: The class com.abc.ic.domain.country.us.TokenizedUnitedStatesAddress$AddressType requires a zero argument constructor or a specified factory method.  Note that non-static inner classes do not have zero argument constructors and are not supported.]
    at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:908)
    at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:157)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:170)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:157)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:117)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:107)

共有1个答案

闽经纬
2023-03-14

我是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();
    }

}

然后在绑定文件中挂起适配器,如下所示:

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

就您输入的bug而言,EclipseLink实际上在这种情况下的行为是正确的,我们没有对Apache Commons类进行任何特殊处理,因此仍然需要默认的无参数构造函数(或其他处理机制)。但是,我将更新您的bug,并将其更改为一个增强请求,以便立即支持Apache枚举,我们将对其进行评估。

谢谢,

 类似资料:
  • 许多 Hibernate 映射元素具有 node 属性。这使你可以指定用来保存 属性或实体数据的 XML 属性或元素。node 属性必须是下列格式之一: "element-name":映射为指定的 XML 元素 "@attribute-name":映射为指定的 XML 属性 ".":映射为父元素 "element-name/@attribute-name":映射为指定元素的指定属性 对于集合和单值

  • 问题内容: 我有一个类似的xml: 我想将元素映射到类MyBean中的属性 有什么办法可以做到吗?我正在使用JDK 1.6随附的jaxb 问题答案: 注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB(JSR-222) 专家组的成员。 使用任何JAXB(JSR-222)实现 使用任何JAXB(JSR-222)实现,您都可以使用来映射此用例。 ThetaValue

  • 我不明白为什么我在下面所做的XmlPath映射会显示为NULL。我的语法有问题吗?我在别处使用了类似的语法,没有问题。 谢谢你提供的线索..约翰

  • 问题内容: 我有一个深层的XML结构,其中包含许多没有意义的包装程序,我将它们映射到一个Java类。使用@XmlPath映射简单的数据类型是在公园里散步,但是当涉及到实际上需要自己的类的类型时,我不太确定该怎么做,尤其是当这些类型也应该放在列表中时。 我在将以下示例中的所有类型映射到我的类时遇到问题。由于包装器驻留在使用I 映射的资源中,因此我不能使用,否则我通常会这样做。 示例XML结构 根ja

  • 我有一个很深的XML结构,它有很多无意义的包装器,我要映射到一个Java类。用@xmlpath映射简单的数据类型是一种尝试,但当涉及到实际上需要自己的类的类型时,我不太确定该如何做,特别是当这些类型也应该放在列表中时。 XML结构示例 root.java RefObj.java 更新 在发布了前面的示例之后,我意识到它实际上是按照预期工作的,这让我更加困惑。尽管我试图在生产代码中复制(以前的)工作

  • 现在我有了这堂课: 并且我有: 如果运行此代码,将得到: 我该怎么解决这个? 我搜索了SO和Google,这些答案都不起作用: 使用Eclipselink.media-type值设置封送器属性时的PropertyException:Application/JSON JAXB javax.xml.bind.PropertyException