在服务器端更改数据模型后,我的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来忽略未知元素?
答案 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);