2014-07-18 116 views
2

後在服務器端我的XStream的客戶端拋出異常XStreamMarshaller忽略未知元素

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter $ UnknownFieldException變化數據模型:沒有這樣的場{}字段名

爲了防止這種行爲,我嘗試做一些事情來忽略未知元素。 我使用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:沒有這樣的現場設備名

如何我解決了我的問題?我如何實現XStreamMarshaller來忽略未知元素?

+0

你可以包括你的數據模型,並突出顯示最近的變化? – andrel

回答

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); 
+1

ignoreUnknownElements()IS用於解組並且對於我跳過不可映射的XML標記具有預期的結果。如果您查看AbstractReflectionConverter的源代碼,您將注意到在解組數據時拋出UnknownFieldException - 而不是在編組時。對我來說,上面的代碼是打算做什麼或者它如何解決所指出的問題並不明顯。也就是說,我也不清楚OP爲什麼會遇到這種異常 - 需要查看更多信息,包括XML是否被解組。 –