2012-01-24 14 views
6

Mam właściwości String w obiekcie adnotacjami następująco:JAXB - puste znaczniki bez xsi: nil

@XmlElement(name = "Item", required = true, nillable = true) 
private String item; 

Wynik po Organizowanie jest

<Item xsi:nil="true"/> 

natomiast chciałbym go mieć

<Item/> 

ponieważ usługa innej firmy, która akceptuje moje wiadomości XML, chce tego typu. Używam jaxb2. Czy ktoś wie, jak mógłbym to zrobić?

Thanks a lot

Odpowiedz

1

UWAGA: Jestem EclipseLink JAXB (MOXy) ołowiu i członkiem grupy JAXB (JSR-222) ekspertów.

Poniższy przykład wymaga użycia MOXy jako dostawcy JAXB. Wynika to z faktu, że JAXB RI nie wywołuje XmlAdapter, gdy pole/właściwość ma wartość null. Więcej informacji na temat określania Moxy jako dostawcę JAXB patrz:

StringAdapter

The XmlAdapter przeliczy wartość String na obiekt z właściwością uwagami z @XmlValue.

package forum8986842; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class StringAdapter extends XmlAdapter<StringAdapter.AdaptedString, String>{ 

    @Override 
    public String unmarshal(AdaptedString adaptedString) throws Exception { 
     if(null == adaptedString) { 
      return null; 
     } 
     String string = adaptedString.value; 
     if("".equals(string)) { 
      return null; 
     } 
     return string; 
    } 

    @Override 
    public AdaptedString marshal(String string) throws Exception { 
     AdaptedString adaptedString = new AdaptedString(); 
     adaptedString.value = string; 
     return adaptedString; 
    } 

    public static class AdaptedString { 
     @XmlValue public String value; 
    } 

} 

głównej

@XmlJavaTypeAdapter Adnotacja jest używany do określenia XmlAdapter:

package forum8986842; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement(name="Root") 
public class Root { 

    private String item; 

    @XmlElement(name = "Item", required = true, nillable = true) 
    @XmlJavaTypeAdapter(StringAdapter.class) 
    public String getItem() { 
     return item; 
    } 

    public void setItem(String item) { 
     this.item = item; 
    } 

} 

Demo

Następujący kod może być stosowane do wykazania wyżej odwzorowania. Dwa dokumenty są używane jeden z pustym elementem Item, a drugi z wypełnionym elementem Item.

package forum8986842; 

import java.io.StringReader; 
import javax.xml.bind.*; 

public class Demo { 

    private JAXBContext jc; 

    public Demo() throws JAXBException { 
     jc = JAXBContext.newInstance(Root.class); 
    } 

    public static void main(String[] args) throws Exception { 
     Demo demo = new Demo(); 
     demo.demo("<Root><Item/></Root>"); 
     demo.demo("<Root><Item>Hello World</Item></Root>"); 
    } 

    private void demo(String xml) throws JAXBException { 
     System.out.println("\n\nINPUT: " + xml); 
     StringReader stringReader = new StringReader(xml); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Root root = (Root) unmarshaller.unmarshal(stringReader); 

     System.out.println("ITEM: " + root.getItem()); 

     System.out.print("OUTPUT: "); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

Wyjście

Poniżej znajduje się wyjście z uruchomieniem kodu Demo:

INPUT: <Root><Item/></Root> 
ITEM: null 
OUTPUT: <Root><Item/></Root> 

INPUT: <Root><Item>Hello World</Item></Root> 
ITEM: Hello World 
OUTPUT: <Root><Item>Hello World</Item></Root> 

Aby uzyskać więcej informacji

0

znalazłem zmieniając xsd było łatwiejsze

<xs:element name="name"> 
    <xs:complexType/> 
</xs:element> 

w kodzie, gdy auto wygenerować java src/zajęcia

należy podać nową nazwę i ustaw Nazwę na dowolną nazwę obiektu należącą pod

Powiązane problemy