java - namespaceprefixmapper - xmlns marshaller
Cómo evitar que JAXB escriba espacios de nombres no utilizados durante la ordenación (4)
Es posible que esto no sea posible ya que, mientras se realiza el cálculo de referencias de esta jerarquía de objetos, al momento de crear la etiqueta raíz, la información sobre qué objetos son nulos v / s no nulos puede no estar disponible. Cualquier intento de obtener esta información de antemano también puede tener efectos secundarios asociados, ya que se invocan los métodos de acceso respectivos. Por lo tanto, JAXB utilizará estáticamente la información de JAXBContext para completar esta información.
¿Alguna vez alguien ha podido eliminar los espacios de nombres no utilizados durante la clasificación de un objeto utilizando JAXB? Aquí hay un enlace de la función solicitada: https://github.com/javaee/jaxb-v2/issues/103 (ver descripción)
¿Hay alguna propiedad para configurar JAXB para esto? ¿Se ha solucionado esto en MOXy?
Actualmente estoy recorriendo el objeto que se debe ordenar y extraigo todas las clases que deben vincularse a Class[] classesToBeBound
. Luego creo un nuevo JAXBContext.newInstance(classesToBeBound)
Los espacios de nombres no utilizados ahora no están incluidos en el XML.
Sé que la validación de XML es válida incluso con los espacios de nombres no utilizados, pero para mí esto es algo que un marco debería manejar.
El siguiente enlace https://blogs.oracle.com/enterprisetechtips/entry/customizing_jaxb menciona varios arreglos (vea la mitad del texto en alguna parte) pero al intentar encontrar la solución en esos enlaces, el enlace está roto o nadie está realmente resuelto. eso.
Cualquier comentario es bienvenido.
(EDITAR) Texto sin formato:
DADO
a new instance of JAXBContext and add 2 classes with each a separate namespace.
CUANDO
marshalling a class that has these 2 classes as a property but only 1 of them is not null
ENTONCES
I expect only the namespace of the property that is not null to be visible in the XML.
PERO el ACTUAL es
that both namespaces are in the xml.
Entonces, mi pregunta fue ¿cómo puedo eliminar o decirle a JAXB que NO escriba los espacios de nombres no utilizados?
Para ponerlo en código java: GIVEN
public class Foo{
private Bar bar; //namespace something2
private User user; //namespace user
}
CUANDO
JAXBContext c = JAXBContext.newInstance(Foo.class, Bar.class, User.class);
...
Foo foo = new Foo();
foo.setBar(null);
foo.setUser(new User("Bob"));
marshaller.umarshal(foo);
ENTONCES espero que el xml sea
<foo xmlns="something1" xmlns:user="user">
<user:name>Bob</user:name>
</foo>
PERO el ACTUAL es (note el espacio de nombres something2)
<foo xmlns="something1" xmlns:user="user" xmlns:bar="something2">
<user:name>Bob</user:name>
</foo>
Por supuesto, este es un ejemplo simplificado y nuestra especificación de un tipo tiene alrededor de 30 espacios de nombres diferentes.
Intente algo como esto marshaller.setProperty (Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "clase para la que no se necesita namepsace"); en su caso, debe ser marshaller.setProperty (Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, bar.class);
Por lo que sé, esto no es posible en JAXB, y en realidad es un problema bien conocido. Como lo ha notado, la lista de espacios de nombres producidos son los que se han registrado en su JAXBContext, y no los que se usan efectivamente al ordenar :-(
En el pasado, utilicé la misma solución que usted (identifique las diversas clases utilizadas y reduzca JAXBContext a este conjunto limitado de clases).
Otra solución típica es un procesamiento de 2 pasos: un primer cálculo de referencias con JAXB, seguido de una transformación XSLT para deshacerse de los espacios de nombres "contaminantes".
Sí, podrían ser omitidos. No estoy seguro de haber entendido bien el problema al que te enfrentas. Pero no hay problema para ordenar un objeto sin espacios de nombres.