`
qq123zhz
  • 浏览: 524436 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

xstream javabean设置属性默认值的问题

    博客分类:
  • java
 
阅读更多

  在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());

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics