在JaxB中解组集合

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/


LE *_*oît 6

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)

你得到你的收藏家的二传手

希望它能帮到人们

再见


bdo*_*han 5

注意: 我是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)