xstream javabean设置属性默认值的问题(默认值被覆盖)

在xstream反序列化使用过程中发现,如果xml无该属性,则改属性会被自动复制为null。

Xml代码 

 收藏代码

  1. <text name="fkzhzh" title="付款账户账号" validateRule="required,acctno" />  

 

Java代码 

 收藏代码

  1. public abstract class SBase {  
  2.   
  3.     @XStreamAsAttribute  
  4.     String id = "";  
  5.   
  6.     @XStreamAsAttribute  
  7.     String name = "";  
  8.     @XStreamAsAttribute  
  9.     String title = "";  
  10.     @XStreamAsAttribute  
  11.     String enabled = "true";  
  12.   
  13.     @XStreamAsAttribute  
  14.     String value = "";  
  15.   
  16.     @XStreamAsAttribute  
  17.     String newLine = "false";  
  18.   
  19.     @XStreamOmitField  
  20.     <span style="color: #ff0000;">String typeName = "";  
  21. </span>  

 

Java代码 

 收藏代码

  1. @XStreamAlias("text")  
  2. public class SText extends SBase {  
  3.     @XStreamAsAttribute  
  4.     private String validateRule ;  
  5.   
  6.     public SText() {  
  7.         setTypeName("text");  
  8.     }  
  9.     public String getValidateRule() {  
  10.         return validateRule;  
  11.     }  
  12.   
  13.     public void setValidateRule(String validateRule) {  
  14.         this.validateRule = validateRule;  
  15.     }  
  16.     public String getTypeName() {  
  17.         return typeName;  
  18.     }  
  19.     public void setTypeName(String typeName) {  
  20.         this.typeName = typeName;  
  21.     }  
  22.       
  23.       
  24. }  

 可以看到xml中无typeName属性,但是在javabean中存在该属性,在反序列化过程中,该属性会被清除为null。

改属性默认值为setTypeName("text");,默认值为"text"。为了保存改默认值,必须在初始化的时候设置:

com.thoughtworks.xstream.XStream.XStream(ReflectionProvider reflectionProvider)

必须继承实现PureJavaReflectionProvider 类。

public class AnnotationJavaReflectionProvider extends PureJavaReflectionProvider

Java代码 

 收藏代码

  1. public class AnnotationJavaReflectionProvider extends PureJavaReflectionProvider {  
  2.   
  3.     /** 
  4.      * 写字段时验证字段可以被访问,且对于String类型需要进行trim 
  5.      */  
  6.     @Override  
  7.     public void writeField(Object object, String fieldName, Object value, Class definedIn) {  
  8.         Field field = fieldDictionary.field(object.getClass(), fieldName, definedIn);  
  9.         validateFieldAccess(field);  
  10.         try {  
  11.             if (value instanceof String)  
  12.                 field.set(object, ((String)value).trim());  
  13.             else field.set(object, value);  
  14.         } catch (IllegalArgumentException e) {  
  15.             throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);  
  16.         } catch (IllegalAccessException e) {  
  17.             throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);  
  18.         }  
  19.     }  
  20. }  

 重载后在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;
    }
}

 

 

转自:https://zhenghuazhi.iteye.com/blog/1852451

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值