2014-07-18 3 views
2

Après le changement modèle de données côté serveur mon client XStream jet d'exceptionXStreamMarshaller ignorer les éléments inconnus

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter $ UnknownFieldException: Aucun champ {} fieldName

Pour éviter ce comportement, j'essaie de faire quelque chose pour ignorer les éléments inconnus. J'utilise XStreamMarshaller de Spring-oxm 4.0.5 et XStream 1.4.5. Je sais que depuis la version 1.4.5 de XStream est disponible la méthode ignoreUnknownElements().

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

La solution ci-dessus ne fonctionne pas et je reçois toujours l'exception mentionnée.

J'ai un modèle côté client copié du serveur. Par exemple:

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 
} 

Si je champ de commentaire par exemple DEVICE_MODEL j'aurai Exception

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter $ UnknownFieldException: Aucun champ device_name

Comment Je résous mon problème? Comment puis-je implémenter XStreamMarshaller pour ignorer les éléments inconnus?

+0

Pouvez-vous inclure votre datamodel et mettre en évidence la modification récente? – andrel

Répondre

3

La première chose est que la méthode ignoreUnknownElements() est disponible puisque XStream 1.4.5 est seulement pour marshaling pas pour unmarshaling. Cela ne fonctionne donc pas si quelqu'un ajoute un nouveau champ dans le modèle de données côté serveur.

Pour résoudre le problème décrit vous devez remplacer la méthode protégée constructXStream() de la mise en œuvre org.springframework.oxm.xstream.XStreamMarshaller:

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); 
        } 
       }; 
     } 
    }; 
}} 

Vous ne devez utiliser votre propre implémentation dans la déclaration XStreamMarshaller:

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

ignoreUnknownElements() IS pour unmarshalling et a le résultat attendu pour moi d'ignorer les balises XML qui ne sont pas mappables. Si vous regardez le code source de AbstractReflectionConverter, vous remarquerez que UnknownFieldException est levée lors du démontage de données - et non lors de la collecte. Ce n'est pas évident pour moi ce que le code ci-dessus est destiné à faire ou comment il résout le problème indiqué. Cela dit, je ne comprends pas non plus pourquoi le PO a connu l'exception - il aurait besoin de voir plus d'informations, y compris le XML qui n'est pas configuré. –

Questions connexes