XStreamMarshaller忽略未知元素

时间:2014-07-18 08:48:31

标签: spring xstream

在服务器端更改数据模型后,我的XStream客户端抛出异常

  

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter $ UnknownFieldException:没有这样的字段{fieldName}

为了防止这种行为,我尝试做一些事情来忽略未知元素。 我正在使用Spring-oxm 4.0.5和XStream 1.4.5中的XStreamMarshaller。我知道,因为XStream版本1.4.5是可用的方法ignoreUnknownElements()。

XStreamMarshaller marshaller = new XStreamMarshaller();
    marshaller.setStreamDriver(streamDriver);
    marshaller.setAutodetectAnnotations(autodetectAnnotations);
    marshaller.getXStream().ignoreUnknownElements();

以上解决方案不起作用,我仍然被提到异常。

我从服务器复制了客户端模型。 例如:

public class Device implements Serializable {

    protected String device_id;

    protected String device_model_code;

    protected String device_model_name;

    protected String device_name;

//getters, setters
}

如果我评论字段,例如device_model,我将有异常

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter $ UnknownFieldException:No such field device_name

如何解决我的问题?如何实现XStreamMarshaller来忽略未知元素?

1 个答案:

答案 0 :(得分:3)

首先,方法ignoreUnknownElements()可用,因为XStream 1.4.5仅用于编组而不是用于解组。因此,如果有人在服务器端的数据模型中添加新字段,它就不起作用。

要解决所描述的问题,您必须从org.springframework.oxm.xstream.XStreamMarshaller实现中覆盖受保护的方法constructXStream():

public class CustomXStreamMarshaller extends XStreamMarshaller {

@Override
protected XStream constructXStream() {
    // The referenced XStream constructor has been deprecated as of 1.4.5.
    // We're preserving this call for broader XStream 1.4.x compatibility.
    return new XStream() {
        @Override
        protected MapperWrapper wrapMapper(MapperWrapper next) {
                return new MapperWrapper(next) {
                    @Override
                    public boolean shouldSerializeMember(Class definedIn, String fieldName) {
                        if (definedIn == Object.class) {
                            return false;
                        }
                        return super.shouldSerializeMember(definedIn, fieldName);
                    }
                };
        }
    };
}}

您只需要在XStreamMarshaller声明中使用自己的实现:

CustomXStreamMarshaller marshaller = new CustomXStreamMarshaller();
    marshaller.setStreamDriver(streamDriver);
    marshaller.setAutodetectAnnotations(autodetectAnnotations);