2009-06-05 4 views
1

J'utilise BeanUtils.copyProperties pour copier le contenu entier d'un objet dans un autre qui en hérite.BeanUtils.copyProperties manque des variables profondément imbriquées?

Voici le contexte, l'objet de domaine à partir duquel les valeurs sont copiées contient un ensemble d'objets de type personnalisé Xref. Ce type personnalisé a une classe incorporée avec différents champs de différents types de classe.

Pour une raison quelconque, l'un des champs d'un objet encapsulé dans l'objet incorporé n'est pas copié. Mais la plupart des autres choses dont j'ai besoin sont copiées.

Avec un exemple:

class Source { 
private Set<Xref> xref; 
... 
} 

class Xref { 
... 
public static class primaryKey { 
... 
private MyObj obj; 
} 
} 

class MyObj { 
private Integer id; 
... 
} 

En utilisant ces noms si je tente d'utiliser BeanUtils.copyProperties pour copier le contenu d'un objet « Source » dans un « SourceExtended » objet la valeur de source.xrefs.get (0) .getPrimaryKey(). GetObj(). GetId() n'est pas copié. Dans l'objet original, il a une valeur mais dans l'objet cible, il est nul ...

Une idée pourquoi ???

Merci.

Répondre

7

De l'Javadocs:

Notez que cette méthode vise à réaliser une « copie superficielle » des propriétés et des propriétés si complexes (par exemple, les imbriquées) ne seront pas copiés.

+0

Got it! Je vais travailler autour de ça alors. Je vous remercie. – Lancelot

3

Voici comment je gère cela avec Spring. Ça pourrait être utile. Ma méthode est une copie de shallowCopyFieldState de Spring mais permet l'utilisation d'un filtre de champ. Ignore la statique et les finales.

Ma méthode

public static void shallowCopyFieldState(final Object src, final Object dest, final FieldFilter filter) 
     throws IllegalArgumentException { 
    if (src == null) { 
     throw new IllegalArgumentException("Source for field copy cannot be null"); 
    } 
    if (dest == null) { 
     throw new IllegalArgumentException("Destination for field copy cannot be null"); 
    } 
    if (!src.getClass().isAssignableFrom(dest.getClass())) { 
     throw new IllegalArgumentException("Destination class [" + dest.getClass().getName() 
       + "] must be same or subclass as source class [" + src.getClass().getName() + "]"); 
    } 
    org.springframework.util.ReflectionUtils.doWithFields(src.getClass(), 
      new org.springframework.util.ReflectionUtils.FieldCallback() { 
       public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException { 
        org.springframework.util.ReflectionUtils.makeAccessible(field); 
        final Object srcValue = field.get(src); 
        field.set(dest, srcValue); 
       } 
      }, filter); 
} 

doWithFields de printemps:

/** 
* Invoke the given callback on all fields in the target class, 
* going up the class hierarchy to get all declared fields. 
* @param targetClass the target class to analyze 
* @param fc the callback to invoke for each field 
* @param ff the filter that determines the fields to apply the callback to 
*/ 
public static void doWithFields(Class targetClass, FieldCallback fc, FieldFilter ff) 
     throws IllegalArgumentException { 

    // Keep backing up the inheritance hierarchy. 
    do { 
     // Copy each field declared on this class unless it's static or file. 
     Field[] fields = targetClass.getDeclaredFields(); 
     for (int i = 0; i < fields.length; i++) { 
      // Skip static and final fields. 
      if (ff != null && !ff.matches(fields[i])) { 
       continue; 
      } 
      try { 
       fc.doWith(fields[i]); 
      } 
      catch (IllegalAccessException ex) { 
       throw new IllegalStateException(
         "Shouldn't be illegal to access field '" + fields[i].getName() + "': " + ex); 
      } 
     } 
     targetClass = targetClass.getSuperclass(); 
    } 
    while (targetClass != null && targetClass != Object.class); 
} 
Questions connexes