Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XStream XStreamMarshaller CannotResolveClassException java.util.ArrayList_Java_Spring_Spring Boot_Spring Batch_Xstream - Fatal编程技术网

XStream XStreamMarshaller CannotResolveClassException java.util.ArrayList

XStream XStreamMarshaller CannotResolveClassException java.util.ArrayList,java,spring,spring-boot,spring-batch,xstream,Java,Spring,Spring Boot,Spring Batch,Xstream,我必须使用SpringBatch读取多个XML文件 我正在使用XStream,我正在努力读取对象的ArrayList 错误堆栈: at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.3.jar:2.4.3] Caused by: com.thoughtworks.xstream.converters.Conversi

我必须使用SpringBatch读取多个XML文件

我正在使用XStream,我正在努力读取对象的ArrayList

错误堆栈:

at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.3.jar:2.4.3]
Caused by: com.thoughtworks.xstream.converters.ConversionException: 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : workCompany
class               : java.util.ArrayList
required-type       : java.util.ArrayList
converter-type      : com.thoughtworks.xstream.converters.collections.CollectionConverter
path                : /person/works/Work/workCompany
line number         : 15
class[1]            : com.oualid.xmltojava.model.Works
converter-type[1]   : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[2]            : com.oualid.xmltojava.model.Person
version             : 5.3.4
-------------------------------
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79) ~[xstream-1.4.9.jar:1.4.9]
我的POJO:

package com.oualid.xmltojava.model;


import com.thoughtworks.xstream.annotations.XStreamAlias;


import java.util.List;

@XStreamAlias("Person")
public class Person {
    @XStreamAlias("personId")
    private Integer personId;
    @XStreamAlias("firstName")
    private String firstName;
    @XStreamAlias("lastName")
    private String lastName;
    @XStreamAlias("email")
    private String email;
    @XStreamAlias("age")
    private Integer age;
    @XStreamAlias("contactDetails")
    private List<String> contactDetails;
    @XStreamAlias("works")
    private Works works;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public Integer getPersonId() {
        return personId;
    }
    public void setPersonId(Integer personId) {
        this.personId = personId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

    public List<String> getContactDetails() {
        return contactDetails;
    }

    public void setContactDetails(List<String> contactDetails) {
        this.contactDetails = contactDetails;
    }

    public Works getWorks() {
        return works;
    }

    public void setWorks(Works works) {
        this.works = works;
    }
}

我的一个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <personId>1</personId>
        <firstName>PETER</firstName>
        <lastName>SCHMIDT</lastName>
        <email>pschmidt0@aboutads.info</email>
        <contactDetails>
            <string>contact1</string>
            <string>contact2</string>
        </contactDetails>
        <age>28</age>
        <works>
            <Work>
                <workCompany>ESI</workCompany>
                <workMission>Java Developper</workMission>
            </Work>
            <Work>
                <workCompany>ESI</workCompany>
                <workMission>JS Developper</workMission>
            </Work>
        </works>

    </person>
</persons>

1.
彼得
施密特
pschmidt0@aboutads.info
联系人1
联系人2
28
ESI
Java开发者
ESI
JS开发人员
其他阅读器

@Bean
    public StaxEventItemReader<Person> reader(){
        StaxEventItemReader<Person> reader = new StaxEventItemReader<Person>();
        //reader.setResource(new ClassPathResource("persons.xml"));
        reader.setFragmentRootElementName("person");


        Map<String,String> aliasesMap =new HashMap<String,String>();
        aliasesMap.put("person", "com.oualid.xmltojava.model.Person");
        aliasesMap.put("works", "com.oualid.xmltojava.model.Works");
        aliasesMap.put("Work", "com.oualid.xmltojava.model.Work");
        XStreamMarshaller marshaller = new XStreamMarshaller();
        marshaller.setAliases(aliasesMap);

        reader.setUnmarshaller(marshaller);



        return reader;
    }
@Bean
public StateVentitemReader(公共文件阅读器){
statxeventitemreader reader=新的statxeventitemreader();
//setResource(新类路径资源(“persons.xml”);
reader.setFragmentRootElementName(“人员”);
映射别名Map=newhashmap();
别名map.put(“person”、“com.oualid.xmltojava.model.person”);
别名map.put(“works”、“com.oualid.xmltojava.model.works”);
别名map.put(“Work”,“com.oualid.xmltojava.model.Work”);
XStreamMarshaller marshaller=新的XStreamMarshaller();
marshaller.setalias(aliasesMap);
读卡器。setUnmarshaller(marshaller);
返回读取器;
}

作为参考,此读取器被传递到
multiResourceItemReader
,如果XML文件中没有
,它就可以正常工作Spring批处理不会直接处理解组,它会从Spring oxm将其委托给
org.springframework.oxm.Unmarshaller
。所以这个问题与SpringBatch本身无关,而是XStream的映射问题

也就是说,根据您如何定义集合
Person.works
works.works
,您需要在marshaller定义中添加隐式集合映射,如下所示:

Map<Class<?>, String> implicitCollections = new HashMap<>();
implicitCollections.put(Works.class, "Work");
marshaller.setImplicitCollections(implicitCollections);

Map如果其他任何人将面临相同的问题,我将发布响应:

即使在我添加
@XStreamImplicit(itemFieldName=“Work”)
时,我发现封送员并不知道这个注释

因此,我有两种可能的解决方案:

1-@Mahmoud Ben Hassine溶液如上

2-只需将自动检测注释激活为
true

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setAutodetectAnnotations(true);
当然,不要忘记为列表添加注释:

@XStreamImplicit(itemFieldName = "Work")
private List<Work> Work;
@XStreamImplicit(itemFieldName=“Work”)
私人清单工作;
我更喜欢第二个,因为我有一个非常复杂的XML,需要阅读大量的对象集合,所以我想注释应该是干净的


愉快的编码:)

感谢Mahmoud的回复,它奏效了,但我有一个更干净的解决方案,就是将AutoDetectanNotations设置为true,以避免添加隐式集合,因为原始XML确实比我发布的更复杂。
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setAutodetectAnnotations(true);
@XStreamImplicit(itemFieldName = "Work")
private List<Work> Work;