Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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
Java JaxB2Marshaller未将XML绑定到Kotlin数据类_Java_Xml_Kotlin_Jaxb_Spring Batch - Fatal编程技术网

Java JaxB2Marshaller未将XML绑定到Kotlin数据类

Java JaxB2Marshaller未将XML绑定到Kotlin数据类,java,xml,kotlin,jaxb,spring-batch,Java,Xml,Kotlin,Jaxb,Spring Batch,我正在编写一个批处理作业来解析XML、提取字段并将它们保存在数据库中。在解析XML时,它会选择2个根元素,但会将所有字段保留为空,因此在我的数据库中,我有2条记录将为空字段。似乎无法理解为什么它无法读取元素。。。短暂性脑缺血发作 @Bean fun xmlFileItemReader(environment: Environment): ItemReader<ConsumerInfo> { val xmlFileReader = StaxEventItem

我正在编写一个批处理作业来解析XML、提取字段并将它们保存在数据库中。在解析XML时,它会选择2个根元素,但会将所有字段保留为空,因此在我的数据库中,我有2条记录将为空字段。似乎无法理解为什么它无法读取元素。。。短暂性脑缺血发作

  @Bean
    fun xmlFileItemReader(environment: Environment): ItemReader<ConsumerInfo> {
        val xmlFileReader = StaxEventItemReader<ConsumerInfo>()
        xmlFileReader.setResource(ClassPathResource(environment.getRequiredProperty(PROPERTY_XML_SOURCE_FILE_PATH)))
        xmlFileReader.setFragmentRootElementName("ConsumerInfo")

        val customerMarshaller = Jaxb2Marshaller()
        customerMarshaller.setClassesToBeBound(ConsumerInfo::class.java)
        xmlFileReader.setUnmarshaller(customerMarshaller)


        return xmlFileReader
    }
XML

更新:

在使用Kotlin数据类时,@XmlElement(name=“****”)似乎没有将读卡器/封送器映射到该字段,而是使用val名称尝试映射。如果希望将@XmlELement与Kotlin一起使用,则需要显式地创建getter

Kotlin溶液:

@XmlRootElement(name = "ConsumerInfo")
class DemoCustomer {


    @get:XmlElement(name = "FirstName")
    var firstName: String? = null

    @get:XmlElement(name = "LastName")
    var lastName: String? = null
}
@XmlRootElement(name = "ConsumerInfo")
public class DemoCustomer {


    private String firstName;

    private String lastName;


    @XmlElement(name= "FirstName")
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @XmlElement(name = "LastName")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
Java解决方案:

@XmlRootElement(name = "ConsumerInfo")
class DemoCustomer {


    @get:XmlElement(name = "FirstName")
    var firstName: String? = null

    @get:XmlElement(name = "LastName")
    var lastName: String? = null
}
@XmlRootElement(name = "ConsumerInfo")
public class DemoCustomer {


    private String firstName;

    private String lastName;


    @XmlElement(name= "FirstName")
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @XmlElement(name = "LastName")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

尝试
@get:xmlement
。这实际上是可行的,但是,您不能使用数据类,您需要显式地创建所有getter
@XmlRootElement(name = "ConsumerInfo")
public class DemoCustomer {


    private String firstName;

    private String lastName;


    @XmlElement(name= "FirstName")
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @XmlElement(name = "LastName")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }