首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moxy不尊重超类/接口属性

Moxy不尊重超类/接口属性
EN

Stack Overflow用户
提问于 2012-08-07 20:42:31
回答 2查看 428关注 0票数 3

enter code here我拥有客户的属性,分布在两个接口上,如下所示。我使用子接口ICustomer定义了外部xml绑定。当我将pojo传递给xml时,似乎Moxy忽略了超级接口的属性firstName。这是一个bug,还是需要在xml元数据中显式地指定这两个接口中的每一个?

基本接口

代码语言:javascript
复制
public interface IBaseCustomer
{
    String getFirstName();

    void setFirstName(final String firstName);
}

子接口

代码语言:javascript
复制
public interface ICustomer extends IBaseCustomer
{
    String getLastName();

    void setLastName(final String lastName);

    Address getAddress();

    void setAddress(final Address address);

    List<PhoneNumber> getPhoneNumbers();

    void setPhoneNumbers(final List<PhoneNumber> phoneNumbers);

    void setPrefix(final String prefix);

    String getPrefix();
}

元数据xml

代码语言:javascript
复制
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="blog.bindingfile">
   <xml-schema namespace="http://www.example.com/customer" element-form-default="QUALIFIED" />
   <java-types>
      <java-type name="ICustomer">
         <xml-root-element name="customer"/>
         <xml-type prop-order="firstName lastName address phoneNumbers" />
         <java-attributes>
            <xml-element java-attribute="firstName" name="first-name" />
            <xml-element java-attribute="lastName" name="last-name" />
            <xml-element java-attribute="phoneNumbers" name="phone-number" />
         </java-attributes>
      </java-type>
      <java-type name="PhoneNumber">
         <java-attributes>
            <xml-attribute java-attribute="type" />
            <xml-value java-attribute="number" />
         </java-attributes>
      </java-type>
   </java-types>
</xml-bindings>

输出

代码语言:javascript
复制
<customer xmlns="http://www.example.com/customer">
   <prefix>pre</prefix>
</customer>

演示代码

代码语言:javascript
复制
Map<String, Object> properties = new HashMap<String, Object>(1);
InputStream resourceAsStream = Demo.class.getResourceAsStream("xml-bindings.xml");
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, resourceAsStream);
JAXBContext jc = JAXBContext.newInstance("blog.bindingfile",  ICustomer.class.getClassLoader(), properties);

ICustomer customer = new Customer();
customer.setPrefix("pre");
customer.setFirstName("firstName");

Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(customer, System.out);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-23 17:40:07

由EclipseLink MOXy V 2.4.1修正。

我发现添加到JavaClassImpl.getSuperClass方法中的超级接口支持如下:

代码语言:javascript
复制
public JavaClass getSuperclass() {
    if(this.superClassOverride != null) {
        return this.superClassOverride;
    }
    if(jClass.isInterface()) {
        Class[] superInterfaces = jClass.getInterfaces();
        if(superInterfaces != null) {
            if(superInterfaces.length == 1) {
                return javaModelImpl.getClass(superInterfaces[0]);
            } else {
                Class parent = null;
                for(Class next:superInterfaces) {
                    if(!(next.getName().startsWith("java.") || next.getName().startsWith("javax."))) {
                        if(parent == null) {
                            parent = next;
                        } else {
                            throw JAXBException.invalidInterface(jClass.getName());
                        }
                    }
                }
                return javaModelImpl.getClass(parent);
            }
        }
    }
    return javaModelImpl.getClass(jClass.getSuperclass());
}
票数 1
EN

Stack Overflow用户

发布于 2012-08-08 20:25:58

MOXy可能没有处理超级接口属性,因为它们不是公共的。默认情况下,JAXB的访问器类型设置为PUBLIC_MEMBER。子接口上的属性被处理是因为它们是在外部绑定中显式指定的,但是超级接口上的属性不是因为它们不是公共的。您可以尝试在包或接口级别(在外部元数据中)指定不同的访问器类型,或者将接口方法公开,以查看这是否解决了问题。

更新

在进一步的调查中,这确实是一个缺陷。EclipseLink不像它应该的那样自动处理父接口。临时的解决办法是在ICustomer的java类型中添加‘super=“ICustomer’。

我打开这个bug来跟踪问题:bug.cgi?id=386959

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11853821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档