Sta*_*tas 14 java jaxb unmarshalling
假设我有这门课程:
public class A {
private HashMap<String, B> map;
@XmlElement
private void setB(ArrayList<B> col) {
...
}
private ArrayList<B> getB() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
当尝试使用JaxB将xml文档解组到此类时,我注意到,而不是调用setB()方法并向我发送B实例列表,JaxB实际上调用了getB()并将B实例添加到返回的列表中.为什么?
我想要调用setter的原因是该列表实际上只是一个临时存储,我想从中构建map字段,所以我想在setter中这样做.
谢谢.
小智 8
这就是jaxb处理集合的方式.当jaxb尝试解组时,你必须确保你有一个非null集合.
有一个插件(我自己从未使用过)但可以提供帮助:https: //jaxb2-commons.dev.java.net/collection-setter-injector/
HY,
你可以用jaxb,它的工作!(和Maven ......)
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<args>
<arg>-Xcollection-setter-injector</arg>
</args>
<plugins>
<plugin>
<groupId>net.java.dev.vcc.thirdparty</groupId>
<artifactId>collection-setter-injector</artifactId>
<version>0.5.0-1</version>
</plugin>
</plugins>
<schemaDirectory>src/schemas</schemaDirectory>
<generateDirectory>src/main/java</generateDirectory>
<extension>true</extension>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
你得到你的收藏家的二传手
希望它能帮到人们
再见
注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员.
您看到的行为因JAXB实现而异.如果没有初始化List属性的值,则EclipseLink JAXB(MOXy)将按预期调用set方法.
欲获得更多信息
例
一个
package forum1032152;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class A {
private ArrayList<B> b;
@XmlElement
public void setB(ArrayList<B> col) {
System.out.println("Called setB");
for(B b : col) {
System.out.println(b);
}
this.b = col;
}
public ArrayList<B> getB() {
return b;
}
}
Run Code Online (Sandbox Code Playgroud)
乙
package forum1032152;
public class B {
}
Run Code Online (Sandbox Code Playgroud)
演示
package forum1032152;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A.class);
File xml = new File("src/forum1032152/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.unmarshal(xml);
}
}
Run Code Online (Sandbox Code Playgroud)
input.xml中
<?xml version="1.0" encoding="UTF-8"?>
<a>
<b></b>
<b></b>
</a>
Run Code Online (Sandbox Code Playgroud)
产量
Called setB
forum1032152.B@8bdcd2
forum1032152.B@4e79f1
Run Code Online (Sandbox Code Playgroud)