Java 使用属性和非包装集合反序列化XML响应

Java 使用属性和非包装集合反序列化XML响应,java,xml,spring-boot,jackson,lombok,Java,Xml,Spring Boot,Jackson,Lombok,我正在尝试从我的restemplate反序列化XML响应,该响应包含需要在映射对象中设置的属性。反应类似于: <schoolResponse> <class id="1" num_of_students="22" name="Ms Barry" > <student key="202" value="Jim" /> <student key="203" value="Tom" /> <s

我正在尝试从我的
restemplate
反序列化
XML
响应,该响应包含需要在映射对象中设置的属性。反应类似于:

<schoolResponse>
    <class id="1" num_of_students="22" name="Ms Barry" >
        <student key="202" value="Jim" />
        <student key="203" value="Tom" />
        <student key="204" value="Dave" />
        <schoolYear>1980</schoolYear>
    </class>
    <class id="2" num_of_students="20" name="Mr Smith">
        <student key="302" value="Jim" />
        <student key="303" value="Tom" />
        <student key="304" value="Dave" />
        <schoolYear>1980</schoolYear>
    </class>
    <class>
        ...
    </class>
</schoolResponse>

此映射没有正确设置值,因此,我想知道这些属性会遇到什么问题。

对于
学生
节点,您需要一个额外的
POJO
。此外,您的所有收藏都已展开。如果混合使用
JAXB
Jackson
注释,则需要注册
com.fasterxml.Jackson.module.JAXB.JaxbAnnotationModule
module。请参见以下固定
POJO
类的示例:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class XmlMapperApp {

    public static void main(String... args) throws IOException {
        File xmlFile = new File("./resource/test.xml").getAbsoluteFile();

        XmlMapper xmlMapper = XmlMapper.xmlBuilder()
                .addModule(new JaxbAnnotationModule())
                .build();

        System.out.println(xmlMapper.readValue(xmlFile, SchoolResponse.class));
    }
}

@Data
@NoArgsConstructor
@ToString
class SchoolResponse {

    @XmlElement(name = "class")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<ClassRoomResponse> classes;
}


@Data
@NoArgsConstructor
class ClassRoomResponse {

    @XmlAttribute(name = "id")
    private String id;

    @XmlAttribute(name = "num_of_students")
    private String numOfStudents;

    @XmlAttribute(name = "name")
    private String teacherName;

    @XmlElement(name = "schoolYear")
    private String schoolYear;

    @XmlElement(name = "student")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Student> students;
}

@Data
@NoArgsConstructor
@ToString
class Student {
    @XmlAttribute(name = "key")
    String key;

    @XmlAttribute(name = "value")
    String value;
}

对于
Student
节点,您需要一个额外的
POJO
。此外,您的所有收藏都已展开。如果混合使用
JAXB
Jackson
注释,则需要注册
com.fasterxml.Jackson.module.JAXB.JaxbAnnotationModule
module。请参见以下固定
POJO
类的示例:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class XmlMapperApp {

    public static void main(String... args) throws IOException {
        File xmlFile = new File("./resource/test.xml").getAbsoluteFile();

        XmlMapper xmlMapper = XmlMapper.xmlBuilder()
                .addModule(new JaxbAnnotationModule())
                .build();

        System.out.println(xmlMapper.readValue(xmlFile, SchoolResponse.class));
    }
}

@Data
@NoArgsConstructor
@ToString
class SchoolResponse {

    @XmlElement(name = "class")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<ClassRoomResponse> classes;
}


@Data
@NoArgsConstructor
class ClassRoomResponse {

    @XmlAttribute(name = "id")
    private String id;

    @XmlAttribute(name = "num_of_students")
    private String numOfStudents;

    @XmlAttribute(name = "name")
    private String teacherName;

    @XmlElement(name = "schoolYear")
    private String schoolYear;

    @XmlElement(name = "student")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Student> students;
}

@Data
@NoArgsConstructor
@ToString
class Student {
    @XmlAttribute(name = "key")
    String key;

    @XmlAttribute(name = "value")
    String value;
}

下面的答案有用吗?下面的答案有用吗?
SchoolResponse(classes=[ClassRoomResponse(id=1, numOfStudents=22, teacherName=Ms Barry, schoolYear=1980, students=[Student(key=202, value=Jim), Student(key=203, value=Tom), Student(key=204, value=Dave)]), ClassRoomResponse(id=2, numOfStudents=20, teacherName=Mr Smith, schoolYear=1981, students=[Student(key=302, value=Jim), Student(key=303, value=Tom), Student(key=304, value=Dave)])])