2010-02-11 2 views
1

Для преобразования bean-> xml в webservices мы используем Aegis из CXF (насколько я понимаю, он совместим с jaxb).Аннотации Bean-To-XML: как обрабатывать вложенную структуру

Это мой тип:

class C{ 
private int a; 
private int b; 
private T t; 
... 
} 

class T{ 
private int t1; 
private int t2; 
} 

мне нужно t.t1 поле, чтобы быть на том же уровне в XML как a и b в C (боб восстановленном из XML должен быть таким:

class C{ 
private int a; 
private int b; 
private int t1 
} 

(код клиента интересует только поле t1 от структуры T).

ответ

1

Вы можете добавить getT1() и setT1(int) в C и сделать getT()@XmlTransient

class C { 
    // snip 

    /** 
    * JAXB only 
    */ 
    @SuppressWarnings("unused") 
    @XmlElement 
    private void setT1(int t1) { 
    if(t != null) { 
     t.setT1(t1); 
    } else { 
     // TODO 
    } 
    } 

    /** 
    * JAXB only 
    */ 
    @SuppressWarnings("unused") 
    private int getT1() { 
    if(t != null) { 
     return t.getT1(t1); 
    } else { 
     // TODO 
    } 
    } 
} 
+0

Ваше решение, вероятно, работает, но я не хочу, чтобы добавить дополнительные публичные методы в мой класс. Это может запутать других разработчиков, если они видят два способа чтения/установки одной переменной: c.getT(). SetT1 (1) и c.setT1(). Конечно, я могу отметить c.setT1() как устаревшее или добавить комментарии, но если это возможно, я бы хотел избежать такого кода. – dbf

+1

@dbf вы также можете сделать эти методы частными. Для этого требуется явно аннотировать их с помощью '@ XmlElement'. – sfussenegger

+0

@ dbf другой возможностью было бы использовать '@ XmlJavaTypeAdapter' и заменить' C' на другой объект (может быть класс, который расширяет или завершает 'C'), который содержит нужные вам свойства. – sfussenegger