[英]JaxB2Marshaller Not Binding XML to Kotlin Data Class
I am writing a batch job to parse XML, extract fields and save them in a Databse. 我正在编写一个批处理作业来解析XML,提取字段并将它们保存在数据库中。 When parsing the XML, It picks up on the 2 root elements, but leaves all the fields null, so in my Database I have 2 records will null fields.
在解析XML时,它会选择2个根元素,但是将所有字段保留为空,因此在我的数据库中我有2个记录将为空字段。 Cant seem to figure out why it cant read the Elements... TIA
似乎无法弄清楚为什么它无法阅读元素...... TIA
@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
}
Kotlin data Class Kotlin数据类
@XmlRootElement(name = "ConsumerInfo", namespace = *Its correct*)
@XmlAccessorType(XmlAccessType.FIELD)
data class ConsumerInfo(
@XmlElement(name = "LastName")
var lastName: String? = null,
@XmlElement(name = "FirstName")
var firstName: String? = null,
@XmlElement(name = "GenerationCode")
var generationCode: String? = null,
@XmlElement(name = "Street")
var street: String? = null,
@XmlElement(name = "City")
var city: String? = null,
@XmlElement(name = "State")
)
XML XML
<ConsumerInfo>
<LastName>lastn</LastName>
<FirstName>firstn</FirstName>
<GenerationCode>g</GenerationCode>
<Street>strt</Street>
<City>cty</City>
<State>st</State>
</ConsumerInfo>
<ConsumerInfo>
<LastName>last</LastName>
<FirstName>first</FirstName>
<GenerationCode>gc</GenerationCode>
<Street>street</Street>
<City>city</City>
<State>state</State>
</ConsumerInfo>
compile('org.springframework.boot:spring-boot-starter-batch')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('com.fasterxml.jackson.module:jackson-module-kotlin')
// https://mvnrepository.com/artifact/org.springframework/spring-oxm
compile group: 'org.springframework', name: 'spring-oxm', version: '5.1.6.RELEASE'
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compile("org.jetbrains.kotlin:kotlin-reflect")
compile ('org.postgresql:postgresql')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Update: 更新:
It appears as if @XmlElement(name = "*****") was not mapping the reader/marshaller to that field when using a Kotlin Data class, it was using the val name to try and map. 在使用Kotlin Data类时,似乎@XmlElement(name =“*****”)没有将reader / marshaller映射到该字段,它使用val名称来尝试映射。 If you want to use @XmlELement with Kotlin, you need to explicitly create your getters as such.
如果你想将@XmlELement与Kotlin一起使用,你需要明确地创建你的getter。
Kotlin Solution: Kotlin解决方案:
@XmlRootElement(name = "ConsumerInfo")
class DemoCustomer {
@get:XmlElement(name = "FirstName")
var firstName: String? = null
@get:XmlElement(name = "LastName")
var lastName: String? = null
}
Java Solution: Java解决方案:
@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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.