Неопределенный тег в xml, сгенерированный MOXy - PullRequest
1 голос
/ 15 марта 2012

У меня есть класс сущности JPA с аннотациями jpa, но без аннотаций jaxb:

@Entity
public class Category extends EntityObject {

    @Id
    private long id;

    // getter setter and stuff
}

Все для jaxb настроено во внешнем XML-файле (потому что нам нужны разные сериализации объекта).

<xml-bindings package-name="mystuff.category">
<java-types>
    <java-type name="mystuff.Category" xml-accessor-type="NONE">
        <xml-root-element name="category" />
        <java-attributes>
            <xml-attribute name="name" java-attribute="name" />
            <xml-element name="id2" java-attribute="id" />
        </java-attributes>
    </java-type>
// morestuff ...

мои проблемы начинаются, когда я делаю экземпляр категории на xml. Результат показывает дополнительный элемент id, который не был настроен в xml. и так как категория (или entityObject) не имеет jaxb-аннотаций, я не понимаю, откуда это.

<category xsi:type="category" name="Category_3">
    <id>1073741951</id>
    <id2>1073741951</id2>
</category>

когда я явно добавляю запись xml-элемента для идентификатора в moxy-xml, я получаю элемент, содержащий идентификатор два раза:

<id>10737419511073741951</id>

Может кто-нибудь сказать мне, как избавиться от этого тега и откуда он взялся?

EDIT

Здесь идентификатор, связанный с кодом в EntityObject-Class

@MappedSuperclass
public abstract class EntityObject implements Serializable {
    private static final long serialVersionUID = 1L;

    public abstract long getId();

    @Field // a solr annotation
    public void setId(long id) {
        if (getId() <= 0) {
            setID(id);
        }
    }

    protected abstract void setID(long id);

1 Ответ

2 голосов
/ 16 марта 2012

Проблема связана с тем, что свойство id в EntityObject переопределяется для дочернего объекта Category.

Раствор № 1 - EntityObject и Category находятся в одной упаковке

Предполагая, что EntityObject находится в том же пакете, что и Category, вы можете сделать следующее:

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="mystuff.category">
    <xml-schema namespace="http://www.example.com/customer"
        element-form-default="QUALIFIED" />
    <java-types>
        <java-type name="EntityObject">
            <java-attributes>
                <xml-transient java-attribute="id" />
            </java-attributes>
        </java-type>
        <java-type name="Category" xml-accessor-type="NONE">
            <xml-root-element name="category" />
            <java-attributes>
                <xml-attribute name="name" java-attribute="name" />
                <xml-element name="id2" java-attribute="id" />
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Решение № 2 - EntityObject и Category находятся в разных пакетах

Если EnityObject и Category находятся в разных пакетах, вы можете создать второй документ внешнего сопоставления:

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="another.pkg">
    <xml-schema namespace="http://www.example.com/customer"
        element-form-default="QUALIFIED" />
    <java-types>
        <java-type name="EntityObject">
            <java-attributes>
                <xml-transient java-attribute="id" />
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Ниже приведен пример кода для начальной загрузки из нескольких документов внешнего сопоставления:

package forum9724475;

import java.util.*;
import javax.xml.bind.*;    
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import another.pkg.EntityObject;
import mystuff.category.Category;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        List<String> oxm = new ArrayList<String>(2);
        oxm.add("mystuff/category/oxm.xml");
        oxm.add("another/pkg/oxm.xml");
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, oxm);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Category.class}, properties);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        Category category = new Category();
        category.setId(1073741951);
        marshaller.marshal(category, System.out);
    }

}

Ниже приведен результат запуска демонстрационного кода:

<?xml version="1.0" encoding="UTF-8"?>
<category xmlns="http://www.example.com/customer">
   <id2>1073741951</id2>
</category>
...