在xstream反序列化使用过程中发现,如果xml无该属性,则改属性会被自动复制为null。
<text name="fkzhzh" title="付款账户账号" validateRule="required,acctno" />
public abstract class SBase {
@XStreamAsAttribute
String id = "";
@XStreamAsAttribute
String name = "";
@XStreamAsAttribute
String title = "";
@XStreamAsAttribute
String enabled = "true";
@XStreamAsAttribute
String value = "";
@XStreamAsAttribute
String newLine = "false";
@XStreamOmitField
String typeName = "";
@XStreamAlias("text")
public class SText extends SBase {
@XStreamAsAttribute
private String validateRule ;
public SText() {
setTypeName("text");
}
public String getValidateRule() {
return validateRule;
}
public void setValidateRule(String validateRule) {
this.validateRule = validateRule;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
}
可以看到xml中无typeName属性,但是在javabean中存在该属性,在反序列化过程中,该属性会被清除为null。
改属性默认值为setTypeName("text");,默认值为"text"。为了保存改默认值,必须在初始化的时候设置:
com.thoughtworks.xstream.XStream.XStream(ReflectionProvider reflectionProvider)
必须继承实现PureJavaReflectionProvider 类。
public class AnnotationJavaReflectionProvider extends PureJavaReflectionProvider
public class AnnotationJavaReflectionProvider extends PureJavaReflectionProvider {
/**
* 写字段时验证字段可以被访问,且对于String类型需要进行trim
*/
@Override
public void writeField(Object object, String fieldName, Object value, Class definedIn) {
Field field = fieldDictionary.field(object.getClass(), fieldName, definedIn);
validateFieldAccess(field);
try {
if (value instanceof String)
field.set(object, ((String)value).trim());
else field.set(object, value);
} catch (IllegalArgumentException e) {
throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);
} catch (IllegalAccessException e) {
throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);
}
}
}
重载后在xstream初始化的时候,传入参数,则实现了保存javabean的默认值。
XStream stream = new XStream(new AnnotationJavaReflectionProvider());