Moxy не соблюдает свойства суперкласса/интерфейса

enter code hereУ меня есть свойства для Customer, распределенные по двум интерфейсам, как показано ниже. У меня есть внешняя привязка xml, определенная с помощью вспомогательного интерфейса ICustomer. Когда я упорядочиваю pojo в xml, кажется, что Moxy игнорирует свойство суперинтерфейса firstName. Это ошибка или мне нужно явно указать каждый из этих двух интерфейсов в метаданных xml?

Базовый интерфейс

public interface IBaseCustomer
{
    String getFirstName();

    void setFirstName(final String firstName);
}

подинтерфейс

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 метаданных

<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>

вывод

<customer xmlns="http://www.example.com/customer">
   <prefix>pre</prefix>
</customer>

Демонстрационный код

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);

person Aravind Yarram    schedule 07.08.2012    source источник


Ответы (2)


Исправлено EclipseLink MOXy V 2.4.1.

Я обнаружил, что поддержка суперинтерфейса добавлена ​​в метод JavaClassImpl.getSuperClass следующим образом:

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());
}
person Barry Zhong    schedule 23.03.2013

Возможно, MOXy не обрабатывает свойства суперинтерфейса, поскольку они не являются общедоступными. По умолчанию тип доступа JAXB установлен на PUBLIC_MEMBER. Свойства в подчиненном интерфейсе обрабатываются, поскольку они явно указаны во внешних привязках, а свойства в суперинтерфейсе не обрабатываются, потому что они не являются общедоступными. Вы можете попробовать указать другой тип доступа на уровне пакета или интерфейса (во внешних метаданных) или сделать методы интерфейса общедоступными, чтобы посмотреть, решит ли это проблему.

обновить

При дальнейшем расследовании это действительно ошибка. EclipseLink не обрабатывает родительские интерфейсы автоматически, как следует. Временный обходной путь — добавить 'super-type="IBaseCustomer"' к типу java для ICustomer.

Я открыл эту ошибку, чтобы отслеживать проблему: https://bugs.eclipse.org/bugs/show_bug.cgi?id=386959

person Matt MacIvor    schedule 08.08.2012
comment
Методы-члены интерфейса Java всегда общедоступны. - person Aravind Yarram; 09.08.2012