在xstream反序列化使用过程中发现,如果xml无该属性,则改属性会被自动复制为null。
Xml代码
- <text name="fkzhzh" title="付款账户账号" validateRule="required,acctno" />
Java代码
- 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
- <span style="color: #ff0000;">String typeName = "";
- </span>
Java代码
- @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
Java代码
- 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());
修改前代码:
public class XmlMessageParser implements MessageParser { @Override public MessageDto parseMessage(Class<? extends MessageDto> clz, String msgContent) { MessageDto messageDto = null; if (msgContent != null) { msgContent = msgContent.trim(); if (StringUtils.isEmpty(msgContent)){ return null; } XStreamUtil.processAnnotations(clz); messageDto = (MessageDto) XStreamUtil.fromXML(msgContent); } return messageDto; } }
修改后代码:
public class XmlMessageParser implements MessageParser {
@Override
public MessageDto parseMessage(Class<? extends MessageDto> clz, String msgContent) {
MessageDto messageDto = null;
if (msgContent != null) {
msgContent = msgContent.trim();
if (StringUtils.isEmpty(msgContent)){
return null;
}
XStream stream = new XStream(new AnnotationJavaReflectionProvider());
stream.processAnnotations(clz);
messageDto = (MessageDto) stream.fromXML(msgContent);
}
return messageDto;
}
}