Создать пустой объект, отменяющий сортировку пустого элемента с помощью JAXB - PullRequest
1 голос
/ 06 августа 2010

Я использую JAXB (реализация EclipseLink) в веб-сервисе JAX-RS.Когда в XML-запросе передается пустой элемент, создается пустой объект.Можно ли настроить JAXB на создание пустого объекта вместо этого?

Пример XML:

<RootEntity>
    <AttributeOne>someText</AttributeOne>
    <EntityOne id="objectID" />
    <EntityTwo />
</RootEntity>

При отмене маршалинга создается экземпляр EntityOne, а атрибут id устанавливается на «objectID» иЭкземпляр EntityTwo создается с нулевыми атрибутами.Вместо этого я хотел бы, чтобы для EntityTwo был нулевой объект, поскольку наличие пустого объекта вызывает у меня проблемы с операциями сохранения JPA.

1 Ответ

0 голосов
/ 09 августа 2010

Вы можете указать это поведение с помощью MOXy's NullPolicy.Вам нужно будет создать DescriptorCustomizer для изменения базовых сопоставлений.Не волнуйтесь, это проще, чем кажется, я продемонстрирую ниже:

import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.nullpolicy.XMLNullRepresentationType;

public class RootEntityCustomizer implements DescriptorCustomizer {

    @Override
    public void customize(ClassDescriptor descriptor) throws Exception {
        XMLCompositeObjectMapping entityTwoMapping = (XMLCompositeObjectMapping) descriptor.getMappingForAttributeName("entityTwo");

        entityTwoMapping.getNullPolicy().setNullRepresentedByEmptyNode(true);
        entityTwoMapping.getNullPolicy().setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
    }

}

Ниже показано, как связать настройщик с классом модели:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlCustomizer;

@XmlRootElement(name="RootEntity")
@XmlCustomizer(RootEntityCustomizer.class)
public class RootEntity {

    private String attributeOne;
    private Entity entityOne;
    private Entity entityTwo;

    @XmlElement(name="AttributeOne")
    public String getAttributeOne() {
        return attributeOne;
    }

    public void setAttributeOne(String attributeOne) {
        this.attributeOne = attributeOne;
    }

    @XmlElement(name="EntityOne")
    public Entity getEntityOne() {
        return entityOne;
    }

    public void setEntityOne(Entity entityOne) {
        this.entityOne = entityOne;
    }

    @XmlElement(name="EntityTwo")
    public Entity getEntityTwo() {
        return entityTwo;
    }

    public void setEntityTwo(Entity entityTwo) {
        this.entityTwo = entityTwo;
    }

}

В следующей версииMOXy (2.2) вы сможете делать это с помощью аннотаций.

@XmlElement(name="EntityTwo")
@XmlNullPolicy(emptyNodeRepresentsNull=true,
              nullRepresentationForXml=XmlMarshalNullRepresentation.EMPTY_NODE)
public Entity getEntityTwo() {
    return entityTwo;
}

Вы можете попробовать это сейчас с одной из ночных сборок EclipseLink 2.2.0:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...