2010-07-06 14 views
6

estoy usando JAXB 2.1.10 del JDK de Sun 1.6.0_18:JAXB: Cadena vacía no produce elemento vacío

D: \ apps \ jdk160_18 \ bin> xjc.exe -versión versión xjc "JAXB 2.1.10 en el JDK 6" Java ™ Arquitectura para XML (JAXB) Implementación de referencia, (2.1.10 construir JAXB en el JDK 6)

Es necesario disponer de contador de referencias de JAXB producir un elemento vacío (por ejemplo <someStringField></someStringField> o <someStringField/>) cuando el objeto JAXB tiene el valor de la cadena vacía (""). Sin embargo, en lugar de hacerlo, JAXB omite el elemento por completo de su salida (como si fuera un elemento opcional).

Mis búsquedas en Internet indicaron que JAXB normalmente debería crear esta etiqueta, siempre y cuando se configura el campo a la cadena vacía no nulo (es decir myJAXBObject.setSomeStringField ("");):

How to instantiate an empty element with JAXB https://jaxb.dev.java.net/tutorial/section_2_2_12_8-No-Value.html#No%20Value

en mi XSD, he tratado de indicar (en todos los sentidos lo sé) que la presencia del elemento es obligatorio, incluso si está vacío:

 <xs:element name="outerElement"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="someStringField" type="xs:string" nillable="false" minOccurs="1" /> 
      <xs:element name="someOtherStringField" type="xs:string" /> 

el retrete código generado ks como este (que es la misma para ambos elementos):

@XmlElement(name = "someStringField", required = true) 
    protected String someStringField; 
    @XmlElement(name = "someOtherStringField", required = true) 
    protected String someOtherStringField; 

Sin embargo, cuando el Mariscal el siguiente objeto ...

outerElement.setSomeStringField(""); 
outerElement.setSomeOtherStringField("Value was set"); 

me sale:

<outerElement> 
      <someOtherStringField>Value was set</someOtherStringField> 
</outerElement> 

Cuando se esperando:

<outerElement> 
      <someStringField></someStringField> 
      <someOtherStringField>Value was set</someOtherStringField> 
</outerElement> 

O:

<outerElement> 
      <someStringField/> 
      <someOtherStringField>Value was set</someOtherStringField> 
</outerElement> 

¿Alguien puede detectar lo que estoy haciendo mal?

Respuesta

0

Disculpas. I THOUGHT Estaba usando JAXB de JDK de Sun, pero no era así. Había un sobrante jaxb.properties en mi carpeta de clases/que fue creado por JDeveloper cuando generé los enlaces. En realidad estaba usando JAXB2.0 de EclipseLink/MOXy.

Al eliminar el archivo de propiedades, se puede usar JAXB2.1 y solucionó el problema.

+1

Esta cuestión (https://bugs.eclipse.org/319028) ha sido arreglado en EclipseLink MOXy. –

Cuestiones relacionadas