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
Nguồn
2012-01-24 20:29:56