2012-10-03 11 views
6

Che cos'è esattamente JAXBElement Boolean e come posso impostarlo sull'equivalente booleano di "true"?JAXBElement <Boolean> vs booleano

Metodo:

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

Questo fa non di compilazione:

returnMessageFilter.setIncludeAllSubaccounts(true); 
+0

Se il metodo prevede un ['JAXBElement'] (http://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBElement.html), perché stai cercando di passare' true'? , un booleano? – NullUserException

+1

È possibile includere il codice in cui si verificano problemi e lo stacktrace? –

+1

Creare un JAXBElement, ad esempio: 'JAXBElement jaxtrue = new JaxBElement (qname, Boolean.TYPE, Boolean.TRUE);' e passa a quello – NullUserException

risposta

8

Un JAXBElement è generato come parte del modello quando un JAXB (JSR-222) implementazione non sarebbe in grado di dire cosa fare basandosi solo sul valore. Nel tuo esempio, probabilmente si ha un elemento come:

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

La proprietà generato non può essere boolean perché boolean non rappresenta null. È possibile creare la proprietà Boolean ma come si fa a distinguere un elemento mancante e un insieme di elementi con xsi:nil. Qui è dove entra in gioco JAXBElement Vedi sotto per un esempio 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); 
    } 

} 

Demo

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); 
    } 

} 

uscita

<?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

Grazie al commento di NullUserException, sono stato in grado implementare questo in una sola riga. È leggermente diverso quindi ho pensato di pubblicarlo a beneficio degli altri.

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

Giusto per chiarire, il QName è il nome del tag XmlElement.

Inoltre, necessaria per l'importazione:

import javax.xml.bind.JAXBElement; 

Modifica

meglio utilizzare il metodo comodo in ObjectFactory classe che restituisce il JAXBElement come suggerito Blaise.

+1

FYI - Come parte del modello generato ci dovrebbe essere una classe 'ObjectFactory' che contiene un metodo di convenienza per creare il' JAXBElement' necessario con l'appropriato 'QName'. –

+1

Oh sì, c'è.Non sembrava giusto che avessi bisogno di crearne uno dal nulla. Grazie! – Jade

Problemi correlati