2012-01-24 24 views
6

tôi có một tài sản String trong một đối tượng chú thích như sau:JAXB - thẻ rỗng không có xsi: nil

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

Kết quả sau khi marshaling là

<Item xsi:nil="true"/> 

trong khi tôi muốn nó được

<Item/> 

vì dịch vụ bên thứ ba chấp nhận tin nhắn XML của tôi muốn nó giống như trường hợp sau. Tôi đang sử dụng jaxb2. Có ai biết làm thế nào tôi có thể có thể làm điều này?

Thanks a lot

Trả lời

1

Lưu ý: Tôi là người dẫn đầu EclipseLink JAXB (MOXy) và là thành viên của nhóm JAXB (JSR-222) chuyên gia.

Ví dụ sau yêu cầu sử dụng MOXy làm nhà cung cấp JAXB. Điều này là do JAXB RI không gọi là XmlAdapter khi trường/thuộc tính rỗng. Để biết thông tin về cách xác định MOXY là nhà cung cấp JAXB bạn thấy:

StringAdapter

Các XmlAdapter sẽ chuyển đổi các giá trị String để một đối tượng với một tài sản chú thích với @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ốc

Các @XmlJavaTypeAdapter chú thích được sử dụng để xác định 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

Các mã sau đây có thể được sử dụng để chứng minh các bản đồ trên. Hai tài liệu được sử dụng với một phần tử rỗng Item và phần tử còn lại có phần tử Item được điền.

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

} 

Output

Sau đây là sản phẩm chạy mã 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> 

Để biết thêm thông tin

0

tôi thấy thay đổi XSD là dễ dàng hơn

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

và trong mã của bạn, khi bạn tự động tạo java src/lớp học của bạn

bạn sẽ xác định danh mới và đặt Tên cho bất kỳ tên đối tượng nào thuộc về

Các vấn đề liên quan