Поле объекта Маршалла как атрибут - PullRequest
2 голосов
/ 30 августа 2011

Вот то, что я до сих пор собирал в своем POJO, используя JAXB:

@XmlRootElement
public class Local {
    private Entity entity;

    public void setEntity(Entity entity) {
        this.entity = entity;
    }

    @XmlElement
    public Entity getEntity() {
        return entity;
    }
}

и

@XmlRootElement
public class Entity {
    private String name;
    private String comment;

    public void setName(String name){
        this.name = name;
    }

    @XmlAttribute
    public String getName(){
        return this.name;
    }

    public void setComment...

    @XmlAttribute
    public void getComment...
}

С этим я получаю что-то вроде этого:*

Однако я бы предпочел иметь атрибут name в качестве атрибута локального:

<local entityName="" entityComment=""></local>

Является ли XmlJavaTypeAdapter хорошим способом для начала?

Спасибо, Алекс

1 Ответ

5 голосов
/ 30 августа 2011

Существует несколько различных вариантов обработки этого варианта использования:

Опция № 1 - XmlAdapter (любая реализация JAXB) * ​​1004 *

Вы можете использовать XmlAdapter для этого варианта использования. Это будет работать до тех пор, пока из объекта Entity будет получено только одно значение атрибута:

EntityAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class EntityAdapter extends XmlAdapter<String, Entity>{

    @Override
    public String marshal(Entity entity) throws Exception {
        if(null == entity) {
            return null;
        }
        return entity.getName();
    }

    @Override
    public Entity unmarshal(String name) throws Exception {
        Entity entity = new Entity();
        entity.setName(name);
        return entity;
    }

}

Местное

XmlAdapter связан с полем / свойством с помощью аннотации @XmlJavaTypeAdapter:

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Local {
    private Entity entity;

    public void setEntity(Entity entity) {
        this.entity = entity;
    }

    @XmlAttribute
    @XmlJavaTypeAdapter(EntityAdapter.class)
    public Entity getEntity() {
        return entity;
    }

}

Для получения дополнительной информации

<Ч />

Опция № 2 - @XmlPath (EclipseLink JAXB (MOXy)

Как вариант, если вы используете EclipseLink JAXB (MOXy) , вы можете использовать расширение @XmlPath. Это полезно, когда объект Entity соответствует нескольким атрибутам XML:

Местное

Указание XPath "." указано, что дочернее содержимое будет записано в родительский элемент

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;

@XmlRootElement
public class Local {
    private Entity entity;

    public void setEntity(Entity entity) {
        this.entity = entity;
    }

    @XmlPath(".")
    public Entity getEntity() {
        return entity;
    }
}

Entity

public class Entity {
    private String name;
    private String comment;

    public void setName(String name){
        this.name = name;
    }

    @XmlAttribute(name="entityName")
    public String getName(){
        return this.name;
    }

    public void setComment(String comment){
        this.comment = comment;
    }

    @XmlAttribute(name="entityComment")
    public String getComment(){
        return this.comment;
    }
}

Для получения дополнительной информации

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