2013-01-23 10 views
12

Mam proste pytanie o JAXB. Oto przykładowy kod:parametr JAXBElement String

//setter that has input JAXBElement 
    b.setBIC(JAXBElement<String> value); 

Jak mogę zainicjować element wejściowy, który wykorzystuje ciąg z innego obiektu?

+0

możliwe duplikat [Jak korzystać JAXBElement w Web Service?] (Http://stackoverflow.com/questions/1393920/how-to-use-jaxbelementstring-in-web-service) – Vadzim

Odpowiedz

27

Możesz bezpośrednio utworzyć instancję JAXBElement lub jeśli wygenerowałeś model Java ze schematu XML, użyj metody convience na wygenerowanej klasie ObjectFactory.

package org.example.schema; 

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

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance("org.example.schema"); 

     Root root = new Root(); 

     QName fooQName = new QName("http://www.example.org/schema", "foo"); 
     JAXBElement<String> fooValue = new JAXBElement<String>(fooQName, String.class, "FOO"); 
     root.setFoo(fooValue); 

     ObjectFactory objectFactory = new ObjectFactory(); 
     JAXBElement<String> barValue = objectFactory.createRootBar("BAR"); 
     root.setBar(barValue); 

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

} 

schema.xsd

Powyższy kod demo jest oparty na modelu Java generowane z poniższego schematu XML. Powodem, dla którego w pierwszej kolejności otrzymujesz właściwość JAXBElement<String>, jest element nillable="true" i minOccurs="0".

<?xml version="1.0" encoding="UTF-8"?> 
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified"> 
    <element name="root"> 
     <complexType> 
      <sequence> 
       <element name="foo" type="string" minOccurs="0" nillable="true"/> 
       <element name="bar" type="string" minOccurs="0" nillable="true"/> 
      </sequence> 
     </complexType> 
    </element> 
</schema> 

głównej

następujące klasy została wygenerowana z schema.xsd i zawiera właściwości jak ten w swoim pytaniu.

package org.example.schema; 

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

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = {"foo","bar"}) 
@XmlRootElement(name = "root") 
public class Root { 

    @XmlElementRef(name = "foo", namespace = "http://www.example.org/schema", type = JAXBElement.class) 
    protected JAXBElement<String> foo; 
    @XmlElementRef(name = "bar", namespace = "http://www.example.org/schema", type = JAXBElement.class) 
    protected JAXBElement<String> bar; 

    public JAXBElement<String> getFoo() { 
     return foo; 
    } 

    public void setFoo(JAXBElement<String> value) { 
     this.foo = value; 
    } 

    public JAXBElement<String> getBar() { 
     return bar; 
    } 

    public void setBar(JAXBElement<String> value) { 
     this.bar = value; 
    } 

} 

ObjectFactory

Poniżej jest generowany ObjectFactory klasa, która zawiera metody wygoda dla tworzenia wystąpień JAXBElement.

package org.example.schema; 

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

@XmlRegistry 
public class ObjectFactory { 

    private final static QName _RootFoo_QNAME = new QName("http://www.example.org/schema", "foo"); 
    private final static QName _RootBar_QNAME = new QName("http://www.example.org/schema", "bar"); 

    public Root createRoot() { 
     return new Root(); 
    } 

    @XmlElementDecl(namespace = "http://www.example.org/schema", name = "foo", scope = Root.class) 
    public JAXBElement<String> createRootFoo(String value) { 
     return new JAXBElement<String>(_RootFoo_QNAME, String.class, Root.class, value); 
    } 

    @XmlElementDecl(namespace = "http://www.example.org/schema", name = "bar", scope = Root.class) 
    public JAXBElement<String> createRootBar(String value) { 
     return new JAXBElement<String>(_RootBar_QNAME, String.class, Root.class, value); 
    } 

} 
+0

Nie, Używam usługi WWW, która ma parametr wejściowy JAXBElement. Czym dokładnie jest QName? –

+0

@ extra90 - Czy moja aktualizacja odpowiedziała na Twój komentarz? –

+0

Tak, teraz rozumiem, czym jest QName. Ale jestem trochę zdezorientowany, mam klienta do obsługi sieci. Usługa ma metodę z parametrem wejściowym JAXBElement. Czy powinienem generować klasy JAXB z ich usługi internetowej? –

0

Możemy to zrobić poniżej, aby utworzyć obiekt JAXBElement: tylko dla innych, którzy mogą mieć ten problem, na przykładzie podanym b.setBIC (wartość JAXBElement); Pozwala założyć, że twoja klasa to ClassB, a obiektem jest b.

b.setBIC(new JAXBElement(new QName(ClassB.class.getSimpleName()), ClassB.class, "StringToBeInitialized")); 
Powiązane problemy