2012-10-03 47 views
6

¿Qué es exactamente JAXBElement Boolean y cómo puedo configurar esto en el equivalente booleano de "true"?JAXBElement <Boolean> vs boolean

Método:

public void setIncludeAllSubaccounts(JAXBElement<Boolean> paramJAXBElement) 
    { 
    this.includeAllSubaccounts = paramJAXBElement; 
    } 

Esto hace no de compilación:

returnMessageFilter.setIncludeAllSubaccounts(true); 
+0

Si el método espera un ['JAXBElement'] (http://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBElement.html), ¿por qué intentas pasar' verdadero' , un booleano? – NullUserException

+1

¿Puedes incluir el código en el que tienes problemas y stacktrace? –

+1

Cree un JAXBElement, por ejemplo: 'JAXBElement jaxtrue = new JaxBElement (qname, Boolean.TYPE, Boolean.TRUE);' y pase ese – NullUserException

Respuesta

8

Un JAXBElement se genera como parte de su modelo cuando una aplicación JAXB (JSR-222) no sería capaz de diga qué hacer según el valor solo. En su ejemplo probablemente tenía un elemento como:

<xsd:element 
    name="includeAllSubaccounts" type="xsd:boolean" nillable="true" minOccurs="0"/> 

La propiedad generada no puede ser boolean porque boolean no representa null. Puede hacer la propiedad Boolean, pero entonces, ¿cómo distingue que ha sido un elemento faltante y un conjunto de elementos con xsi:nil? Aquí es donde entra en juego JAXBElement a continuación encontrará un ejemplo completo:.

Foo

package forum12713373; 

import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo { 

    @XmlElementRef(name="absent") 
    JAXBElement<Boolean> absent; 

    @XmlElementRef(name="setToNull") 
    JAXBElement<Boolean> setToNull; 

    @XmlElementRef(name="setToValue") 
    JAXBElement<Boolean> setToValue; 

} 

ObjectFactory

package forum12713373; 

import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.*; 
import javax.xml.namespace.QName; 

@XmlRegistry 
public class ObjectFactory { 

    @XmlElementDecl(name="absent") 
    public JAXBElement<Boolean> createAbsent(Boolean value) { 
     return new JAXBElement(new QName("absent"), Boolean.class, value); 
    } 

    @XmlElementDecl(name="setToNull") 
    public JAXBElement<Boolean> createSetToNull(Boolean value) { 
     return new JAXBElement(new QName("setToNull"), Boolean.class, value); 
    } 

    @XmlElementDecl(name="setToValue") 
    public JAXBElement<Boolean> createSetToValue(Boolean value) { 
     return new JAXBElement(new QName("setToValue"), Boolean.class, value); 
    } 

} 

demostración

package forum12713373; 

import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     ObjectFactory objectFactory = new ObjectFactory(); 

     Foo foo = new Foo(); 
     foo.absent = null; 
     foo.setToNull = objectFactory.createSetToNull(null); 
     foo.setToValue = objectFactory.createSetToValue(false); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(foo, System.out); 
    } 

} 

salida

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<foo> 
    <setToNull xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
    <setToValue>false</setToValue> 
</foo> 
1

Gracias al comentario de NullUserException, yo era capaz de implementar esto en una sola línea. Es un poco diferente, así que pensé en publicarlo para el beneficio de los demás.

returnMessageFilter.setIncludeAllSubaccounts(new JAXBElement<Boolean>(new QName("IncludeAllSubaccounts"), 
Boolean.TYPE, Boolean.TRUE)); 

Solo para aclarar, QName es el nombre de la etiqueta XmlElement.

Además, necesaria para la importación:

import javax.xml.bind.JAXBElement; 

Editar

mejor usar el método de conveniencia en ObjectFactory clase que devuelve el JAXBElement como se sugiere Blaise.

+1

FYI - Como parte de su modelo generado, debe haber una clase 'ObjectFactory' que contenga un método conveniente para crear el' JAXBElement' necesario con el 'QName' apropiado. –

+1

Oh sí, lo hay.No parecía correcto que tuviera que crear uno de la nada. ¡Gracias! – Jade