actualización - ver edición en la parte inferiorJAXB Anotaciones: ¿cómo puedo hacer que una lista de elementos XmlIDRef tenga el valor de identificación como atributo en lugar de texto del cuerpo del elemento?
IDREFS/keyrefs parecen ser posible en anotaciones JAXB, pero el árbitro termina siendo texto del elemento.
Me gustaría que la referencia sea un atributo de un elemento.
Por ejemplo, dado este modelo de objetos:
@XmlType
public class Employee {
@XmlID
@XmlAttribute
String name;
@XmlAttribute
int years;
@XmlAttribute
String foo;
}
@XmlType
public class Office {
@XmlAttribute
String name;
@XmlElementWrapper
@XmlElement(name = "employee")
List<Employee> employees;
}
@XmlRootElement
public class Company {
@XmlElementWrapper
@XmlElement(name = "office")
List<Office> offices;
@XmlElementWrapper
@XmlElement(name = "employee")
List<Employee> employees;
}
Me gustaría que el formato XML externalizada a terminar pareciéndose a esto:
<company>
<offices>
<office name="nyc">
<employees>
<!--*** id ref to employee name ***-->
<employee ref="alice"/>
<employee ref="bob"/>
</employees>
</office>
<office name="sf">
<employees>
<employee ref="connie"/>
<employee ref="daphne"/>
</employees>
</office>
</offices>
<employees>
<!-- *** name is the id *** -->
<employee name="alice" years="3" foo="bar"/>
<employee name="bob" years="3" foo="bar"/>
<employee name="connie" years="3" foo="bar"/>
<employee name="daphne" years="3" foo="bar"/>
</employees>
</company>
En su lugar, lo mejor que puedo hacer es esto (con las anotaciones que figuran más arriba en el código java):
<company>
<offices>
<office name="nyc">
<employees>
<employee>alice</employee>
<employee>bob</employee>
</employees>
</office>
<office name="sf">
<employees>
<employee>connie</employee>
<employee>daphne</employee>
</employees>
</office>
</offices>
<employees>
<employee name="alice" years="3" foo="bar"/>
<employee name="bob" years="3" foo="bar"/>
<employee name="connie" years="3" foo="bar"/>
<employee name="daphne" years="3" foo="bar"/>
</employees>
</company>
¿hay alguna manera de forzar el idref valor para ser un atributo del empleado, en lugar de texto del cuerpo del elemento? Sé que puedo hacer esto con un Esquema XML, pero me gustaría atenerme a las anotaciones si es posible.
Gracias.
Editar La solución de Torious a continuación casi funciona, pero no funciona en algunas circunstancias.
unmarshalling falla si los elementos de "oficinas" vienen antes (en el archivo xml) los elementos "empleados" a los que hace referencia la oficina. Las referencias de empleados no se encuentran, y el contenedor EmployeeRef tiene un objeto de empleado nulo. Si el "empleado" es el primero, funciona.
Esto no sería un gran problema, pero el método de Mariscal pondrá primero las "oficinas", por lo que falla el intento de unificar lo que acaba de organizarse.
Editar 2 comentario en la respuesta de Torious resuelve el problema del pedido.
yup, esto lo hizo el truco. Gracias. – marathon
bien, esto no funciona en algunas (la mayoría) de las circunstancias. Consulte editar más arriba – marathon
Anote la clase 'Empresa' con' @XmlType (propOrder = {"employees", "offices"}) 'para forzar el orden deseado al ordenar. – Torious