如何为XML输入中可选Segment的BeanIO字段设置默认值?
BeanIO中可选Segment不存在时设置字段默认值的问题
给定以下XML输入样本:
<students> <student> <name>Peter</name> <intern> <internLocation>Ohio</internLocation> </intern> </student> <student> <name>John</name> </student> </students>
对应的BeanIO配置:
<beanio xmlns="http://www.beanio.org/2012/03"> <stream name="students" format="xml" strict="true"> <record name="student" class="com.testapp.model.Student"> <field name="studentName" xmlName="name" maxLength="20" /> <segment name="intern" minOccurs="0"> <field name="internLocation" maxLength="50" minOccurs="0" default="" /> </segment> </record> </stream> </beanio>
模型类Student代码:
public class Student { private String studentName; private String internLocation; // 省略getter/setter等其他代码 }
问题:<intern>是可选Segment,当该Segment不存在时,如何为Student类的internLocation字段设置默认值?尝试用@Field(defaultValue = "")注解标注该字段,但仍得到null值。
解决方案
核心问题是:可选Segment不存在时,BeanIO不会初始化该Segment下的字段,因此字段上的defaultValue配置或注解不会生效。以下是三种可行解决方式:
方案1:修改XML配置,为Segment添加默认值
在<segment>标签中添加defaultValue属性,触发Segment不存在时的字段默认值逻辑:
<segment name="intern" minOccurs="0" defaultValue=""> <field name="internLocation" maxLength="50" minOccurs="0" default="" /> </segment>
当<intern>节点不存在时,BeanIO会初始化该Segment,并将internLocation设置为空字符串。
方案2:直接在模型类字段声明时设置默认值
跳过BeanIO配置,直接在Student类的字段初始化时赋值:
public class Student { private String studentName; private String internLocation = ""; // 省略getter/setter等其他代码 }
这种方式不依赖BeanIO的解析逻辑,无论Segment是否存在,字段都会有默认的空字符串值。
方案3:注解配置场景下使用@Default注解
如果采用注解而非XML配置,可在字段上组合使用@Segment和@Default注解:
public class Student { private String studentName; @Segment(minOccurs = 0) @Default("") private String internLocation; // 省略getter/setter等其他代码 }
注:需确保使用的BeanIO版本支持该注解组合。
内容的提问来源于stack exchange,提问作者Somebody
相关产品推荐
相关产品推荐

