Joh*_*erg 8 java xml generics jaxb marshalling
目标是使用JAXB生成以下XML
<foo>
<bar>string data</bar>
<bar>binary data</bar>
</foo>
Run Code Online (Sandbox Code Playgroud)
是否有允许通用 @XmlValue
字段的解决方法(我需要存储byte[]
和String
数据)?以下是我的愿望:
@XmlRootElement
public class Foo {
private @XmlElement List<Bar> bars;
}
@XmlRootElement
public class Bar<T> {
private @XmlValue T value; // (*)
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个例外
(*)IllegalAnnotationException:
@ XmlAttribute/@ XmlValue需要引用映射到XML文本的Java类型.
您可以利用XmlAdapter
此用例而不是@XmlValue
:
BarAdapter
package forum8807296;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BarAdapter extends XmlAdapter<Object, Bar<?>> {
@Override
public Bar<?> unmarshal(Object v) throws Exception {
if(null == v) {
return null;
}
Bar<Object> bar = new Bar<Object>();
bar.setValue(v);
return bar;
}
@Override
public Object marshal(Bar<?> v) throws Exception {
if(null == v) {
return null;
}
return v.getValue();
}
}
Run Code Online (Sandbox Code Playgroud)
富
在XmlAdapter
与相关联的bars
使用属性@XmlJavaTypeAdapter
注释:
package forum8807296;
import java.util.List;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Foo {
private List<Bar> bars;
@XmlElement(name="bar")
@XmlJavaTypeAdapter(BarAdapter.class)
public List<Bar> getBars() {
return bars;
}
public void setBars(List<Bar> bars) {
this.bars = bars;
}
}
Run Code Online (Sandbox Code Playgroud)
酒吧
package forum8807296;
public class Bar<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
演示
您可以使用以下演示代码测试此示例:
package forum8807296;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Foo foo = new Foo();
List<Bar> bars = new ArrayList<Bar>();
foo.setBars(bars);
Bar<String> stringBar = new Bar<String>();
stringBar.setValue("string data");
bars.add(stringBar);
Bar<byte[]> binaryBar = new Bar<byte[]>();
binaryBar.setValue("binary data".getBytes());
bars.add(binaryBar);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
请注意输出如何包含xsi:type
保留值类型的属性.您可以xsi:type
通过XmlAdapter
返回String
来取消该属性,而不是Object
,如果您这样做,您将需要自己处理转换String
为适当的类型以进行解组操作:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
<bar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">string data</bars>
<bar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:base64Binary">YmluYXJ5IGRhdGE=</bars>
</foo>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10094 次 |
最近记录: |