2014-09-22 2 views
3

У меня есть следующие объектыКак изменить имя элемента XmlRootElement в JAXB, находящемся на объекте?

пленочных

@Entity 
@Table(name="film") 
@XmlRootElement(name = "film") 
public class Film implements Serializable { 

    @Id 
    @Column(name="id") 
    private String fbId; 

    @Column(name="title") 
    private String title; 

    @ManyToMany 
    @JoinTable(
     name="direction", 
     joinColumns={@JoinColumn(name="film", referencedColumnName="id")}, 
     inverseJoinColumns={@JoinColumn(name="person", referencedColumnName="id")}) 
    private Collection<Person> directors; 

    @OneToMany(cascade={CascadeType.ALL}, mappedBy="film") 
    @MapKey(name="character") 
    private Map<String, Performance> performances; 

    //GETTERS 
    @XmlAttribute(name = "fbId") 
    public String getFreebaseId() { 
     return this.fbId; 
    } 

    @XmlElementRefs({ 
     @XmlElementRef(name="director", type=Person.class) 
    }) 
    public Collection<Person> getDirectors() { 
     return this.directors; 
    } 

    @XmlAnyElement(lax=true) 
    public Collection<Performance> getPerformances() { 
     ArrayList performancesArray = new ArrayList<Performance>(); 
     for (Map.Entry<String, Performance> entry : this.performances.entrySet()) { 
      Performance value = entry.getValue(); 
      performancesArray.add(value); 
     } 
     return performancesArray; 
    } 

} 

Человек

@Entity 
@Table(name="person") 
public class Person implements Serializable { 

    @Id 
    @Column(name="id") 
    private String fbId; 

    @Column(name="first_name") 
    private String firstName; 

    @Column(name="last_name") 
    private String lastName; 

    @OneToMany(cascade={CascadeType.ALL}, mappedBy="actor") 
    @XmlTransient 
    private Collection<Performance> performances; 

    //GETTERS 
    @XmlAttribute(name = "fbId") 
    public String getFreebaseId() { 
     return this.fbId; 
    } 

    @XmlElement(name = "firstName") 
    public String getFirstName() { 
     return this.firstName; 
    } 

    @XmlElement(name = "lastName") 
    public String getLastName() { 
     return this.lastName; 
    } 

    @XmlTransient 
    public Collection<Performance> getPerformances() { 
     return this.performances; 
    } 

} 

Каждый фильм имеет один (или несколько) директор и спектакли, которые являются "лицом". Мне не нужен класс для директоров, но я делаю это для выступлений, потому что у них больше информации.

Performance

@Entity 
@Table(name="performance") 
@XmlRootElement(name = "performace") 
public class Performance implements Serializable { 

    @Id 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="film") 
    private Film film; 

    @Id 
    @Column(name="film_character") 
    private String character; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="actor") 
    private Person actor; 

    //TO STRING 
    public String toString() { 
     return this.actor.toString() + " - " + this.character; 
    } 

    //GETTERS 
    @XmlTransient 
    public Film getFilm() { 
     return this.film; 
    } 

    @XmlElementRefs({ 
     @XmlElementRef(name = "firstName", type = Person.class), 
     @XmlElementRef(name = "lastName", type = Person.class) 
    }) 
    public Person getActor() { 
     return this.actor; 
    } 

    @XmlElement(name = "character") 
    public String getCharacter() { 
     return this.character; 
    } 

} 

Когда я запускаю это через JAXB я получаю это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<film fbId="1"> 
    <description>Nice film</description> 
    <person fbId="1"> 
     <firstName>Quentin</firstName> 
     <lastName>Tarantino</lastName> 
    </person> 
    <performace> 
     <person fbId="4"> 
      <firstName>Steve</firstName> 
      <lastName>Buscemi</lastName> 
     </person> 
     <character>Billy</character> 
    </performace> 
    <performace> 
     <person fbId="2"> 
      <firstName>Jhon</firstName> 
      <lastName>Travolta</lastName> 
     </person> 
     <character>Vincent</character> 
    </performace> 
    <performace> 
     <person fbId="3"> 
      <firstName>Samuel</firstName> 
      <lastName>L Jackson</lastName> 
     </person> 
     <character>Jules</character> 
    </performace> 
    <performace> 
     <person fbId="1"> 
      <firstName>Quentin</firstName> 
      <lastName>Tarantino</lastName> 
     </person> 
     <character>Jimmie</character> 
    </performace> 
    <title>Pulp Fiction</title> 
</film> 

Есть ли способ изменить название "лица"? Для того, чтобы получить что-то вроде этого:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<film fbId="1"> 
    <description>Nice film</description> 
    <director fbId="1"> 
     <firstName>Quentin</firstName> 
     <lastName>Tarantino</lastName> 
    </director> 
    <performace fbId="4"> 
     <firstName>Steve</firstName> 
     <lastName>Buscemi</lastName> 
     <character>Billy</character> 
    </performace> 
    <performace fbId="2"> 
     <firstName>Jhon</firstName> 
     <lastName>Travolta</lastName> 
     <character>Vincent</character> 
    </performace> 
    <performace fbId="3"> 
     <firstName>Samuel</firstName> 
     <lastName>L Jackson</lastName> 
     <character>Jules</character> 
    </performace> 
    <performace fbId="1"> 
     <firstName>Quentin</firstName> 
     <lastName>Tarantino</lastName> 
     <character>Jimmie</character> 
    </performace> 
    <title>Pulp Fiction</title> 
</film> 

ответ

2

Варианты:

  • Сделать Director расширяет Person со своим собственным @XmlRootElement
  • Использование JAXBElement<? extends Person> вместо Person

Проблема в том, @XmlElementRef. имя не работает для @XmlRootElement, читать here:

Если тип() является JAXBElement.class, то пространство имен() и имя() указывают на методом завод с XmlElementDecl. Имя элемента XML - это имя элемента из аннотации XmlElementDecl фабричного метода или если элемент из его группы замещения (из которого он является элементом заголовка). В документе XML был заменен , тогда имя элемента: из XmlElementDecl для замещенного элемента.

Если тип() не JAXBElement.class, то имя XML-элемент является имя элемента XML статически связан с типом, используя аннотаций XmlRootElement по типу. Если тип не аннотируется с XmlElementDecl, то это ошибка.

Если тип() не JAXBElement.class, тогда это значение должно быть «".

Кстати

@XmlElementRefs({ 
    @XmlElementRef(name = "firstName", type = Person.class), 
    @XmlElementRef(name = "lastName", type = Person.class) 
}) 

не кажется, действует на меня. @XmlElementRef не должны отображать свойства целевого класса.

+0

Спасибо за «XmlElementRefs», я уже исправил это. Я уже исправил режиссера ... спасибо –

Смежные вопросы