java - online - jaxb unmarshal list
JAXB Marshalling con campos nulos (5)
Esta es una solicitud bastante simple, pero simplemente no encontré la manera de hacerlo.
Básicamente estoy tratando de configurar un rol en JAXB que dice que siempre que se encuentre un campo nulo, en lugar de ignorarlo en la salida, configúrelo en un valor vacío. Así que para la clase:
@XMLRootElement
Class Foo {
Integer num;
Date date;
….
}
Cuando esto se ha incluido en el archivo XML si el campo de fecha es nulo, mi salida no tiene ese elemento. Lo que quiero hacer es incluir todos los campos en la salida; y si son nulos, reemplácelos con - diga un espacio en blanco. Así que la salida debería ser:
<foo>
<num>123</num>
<date></date>
</foo>
Gracias,
Jalpesh.
Como se indica en la otra respuesta, no es válido ya que no es una fecha válida. Tuve un problema similar en el que quería manejar (igual que) especialmente. Como no puede usar nulo, puede usar el mecanismo de valor predeterminado en JAXB. Lo siguiente predeterminará el valor si no se especifica ninguno. Puede a través del código detectar esta fecha especial y manejar este caso de excepción.
@XmlElement(defaultValue="1970-01-01T00:00:00.0-00:00")
Por lo tanto, es posible detectar y vaciar el valor de la fecha, pero simplemente no se puede usar nulo para hacerlo.
En MOX, puede especificar cómo jsonProvider debe hacer su trabajo para JAXB.
Entonces, al hacer JAX-RS, agregue el siguiente código en su clase derivado de la aplicación
Utilicé este código en Tomcat 7 con buenos resultados. (eclipselink 2.4.1)
@ApplicationPath("/rest")
public class RestApplication extends Application
{
...
public Set< Object> getSingletons()
{
HashSet<Object> set = new HashSet<Object>(1);
set.add( newMoxyJsonProvider());
return set;
}
public static MOXyJsonProvider newMoxyJsonProvider()
{
MOXyJsonProvider result = new MOXyJsonProvider();
//result.setAttributePrefix("@");
result.setFormattedOutput( false);
result.setIncludeRoot( false);
result.setMarshalEmptyCollections( true);
//result.setValueWrapper("$");
return result;
}
Sin embargo, en Glassfish 3.1.2 y WAS 8.5, no se necesita newMoxyJsonProvider (), pero el servidor configura el proveedor JAXB. En el caso de Glassfish, que viene con MOXy, presencié los mismos problemas con valores nulos. No lo comprobé todavía, pero supongo que la respuesta está en la configuración de JAXB en el nivel del servidor de aplicaciones, si es posible.
Gracias chicos por sus respuestas.
Chris Dail: probé tu enfoque y realmente no hizo lo que quería. JAXB seguía ignorando mis valores nulos, a pesar de definir un valor predeterminado para mis campos.
Me topé con la respuesta después de que alguien en los foros de Jersey me indicó la sección de documentación 2.2.12.8 Sin valor .
Básicamente, todo lo que tenía que hacer era agregar lo siguiente a mis campos:
@XmlElement(nillable = true)
Una vez que agregué eso, JAXB mostraría esos campos al ordenarlos a XML de esta manera:
...
<num>5</num>
<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
....
Pero pero pero ... una cadena vacía no es una representación léxica válida para una fecha, así que no puedes hacer eso. es decir, si generó un documento XML con un valor vacío para un campo de fecha, no se validará correctamente.
En otras palabras, si su elemento de date
tiene un minOccurs
de 1 o más y no es nillable
, entonces absolutamente debe tener (1 o más) fechas, que no pueden ser nulas (o espacios en blanco, u otros valores distintos).
Prueba esto:
marshal.setListener(new MarshallerListener());
con
public class MarshallerListener extends Marshaller.Listener {
public static final String BLANK_CHAR = "";
@Override
public void beforeMarshal(Object source) {
super.beforeMarshal(source);
Field[] fields = source.getClass().getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
try {
if (f.getType() == String.class && f.get(source) == null) {
f.set(source, BLANK_CHAR);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}