2009-08-19 7 views
23

finden Sie im folgenden KlasseHelfer, um Nicht-Null-Eigenschaften von Objekt zu einem anderen zu kopieren? (Java)

public class Parent { 

    private String name; 
    private int age; 
    private Date birthDate; 

    // getters and setters 

} 

nehme ich an ein übergeordnetes Objekt erstellt haben, wie folgt

Parent parent = new Parent(); 

parent.setName("A meaningful name"); 
parent.setAge(20); 

Hinweis nach oben stehenden Code birth Eigenschaft null ist. Jetzt möchte ich NUR Nicht-Null-Eigenschaften vom Elternobjekt in ein anderes kopieren. So etwas wie

SomeHelper.copyNonNullProperties(parent, anotherParent); 

ich es brauche, weil ich anotherParent Objekt ohne überschreibt seine nicht null mit Nullwerten aktualisieren möchten.

Kennen Sie einen Helfer wie diesen?

Ich akzeptiere minimalen Code als Antwort, ob kein Helfer im Auge

Grüße

+0

entfernt Frühling Tag aus diesem, da es nichts mit Frühling zu tun hat. – Trenton

+0

Das Hibernate-Tag wurde entfernt, da es auch nichts mit dem Ruhezustand zu tun hat. – stian

Antwort

68

Ich vermute, Sie haben bereits eine Lösung, da viel Zeit vergangen ist, seit Sie gefragt haben. Es ist jedoch nicht als gelöst markiert, und vielleicht kann ich anderen Benutzern helfen.

Haben Sie versucht, indem Sie eine Unterklasse des BeanUtilsBean des org.commons.beanutils Pakets definieren? Tatsächlich verwendet BeanUtils diese Klasse, das ist also eine Verbesserung der von dfa vorgeschlagenen Lösung.

Bei der Überprüfung der source code dieser Klasse, ich denke, Sie können die copyProperty Methode überschreiben, indem Sie auf Null-Werte und nichts tun, wenn der Wert null ist.

Etwas wie folgt aus:

package foo.bar.copy; 
import java.lang.reflect.InvocationTargetException; 
import org.apache.commons.beanutils.BeanUtilsBean; 

public class NullAwareBeanUtilsBean extends BeanUtilsBean{ 

    @Override 
    public void copyProperty(Object dest, String name, Object value) 
      throws IllegalAccessException, InvocationTargetException { 
     if(value==null)return; 
     super.copyProperty(dest, name, value); 
    } 

} 

Dann können Sie einfach einen NullAwareBeanUtilsBean instanziiert und es verwenden, Ihre Bohnen zu kopieren, zum Beispiel:

BeanUtilsBean notNull=new NullAwareBeanUtilsBean(); 
notNull.copyProperties(dest, orig); 
+0

eine ideale Antwort würde das Beispiel der Elternklasse in der Frage – kiedysktos

+0

Ich versuche, zu versuchen implementieren Sie Ihre Ideen, aber bisher keinen Erfolg. Ich habe einen Thread für diese erstellt http://stackoverflow.com/questions/41125384/copy-non-null-properties-from-one-object-to-another-using-beanutilsbean – kiedysktos

+1

copyProperty() ist statische Methode http: // commons.apache.org/proper/commons-beanutils/javadocs/v1.9.3/apidocs/index.html – Sadanand

0

Sie Apache Common BeanUtils verwenden können, genauer gesagt the copyProperties helper in BeanUtils class:

BeanUtils.copyProperties(parent, anotherParent); 

aber warum möchten Sie nur Nicht-Null-Eigenschaften kopieren? Wenn eine Eigenschaft in parent Null ist, durch einfaches Kopieren haben Sie null auch in anotherParent oder?

Nur raten ... möchten Sie eine Bohne mit einer anderen Bohne aktualisieren?

+1

Ja, ich möchte eine andere Bean aktualisieren, ohne ihre Nicht-Null-Werte zu überschreiben. –

+1

+1 für einen vernünftigen Vorschlag für die Verwendung von Bibliotheken ... manchmal fühle ich mich wie wir sind die einsamen Stimmen in der Wildnis auf diesem – skaffman

+2

Hallo, tut mir leid, aber es funktioniert nicht. Wenn ich eine nicht null haben anotherParent.getBirthDate() und ich rufe BeanUtils.copyProperties (übergeordnete, anotherParent) anotherParent.getBirthDate() wird null –

1

einfach Ihre eigenen Kopiermethode verwenden:

void copy(Object dest, Object source) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, 
     InvocationTargetException { 
    BeanInfo beanInfo = Introspector.getBeanInfo(source.getClass()); 
    PropertyDescriptor[] pdList = beanInfo.getPropertyDescriptors(); 
    for (PropertyDescriptor pd : pdList) { 
     Method writeMethod = null; 
     Method readMethod = null; 
     try { 
      writeMethod = pd.getWriteMethod(); 
      readMethod = pd.getReadMethod(); 
     } catch (Exception e) { 
     } 

     if (readMethod == null || writeMethod == null) { 
      continue; 
     } 

     Object val = readMethod.invoke(source); 
     writeMethod.invoke(dest, val); 
    } 
} 
0

Ich weiß, dass diese Frage ziemlich alt ist, aber ich dachte, die Belo w Antwort kann für jemanden nützlich sein.

Wenn Sie Spring verwenden, können Sie die folgende Option versuchen.

Wieder können Sie PropertyDescriptor und das Set von den obigen Methoden verwenden, um das Objekt zu ändern.

2

Wenn der Rückgabetyp Ihres Setter nicht ungültig ist, funktioniert BeanUtils von Apache nicht, Frühling kann. Kombiniere die beiden.

package cn.corpro.bdrest.util; 

import org.apache.commons.beanutils.BeanUtilsBean; 
import org.apache.commons.beanutils.ConvertUtilsBean; 
import org.apache.commons.beanutils.PropertyUtilsBean; 
import org.springframework.beans.BeanUtils; 

import java.beans.PropertyDescriptor; 
import java.lang.reflect.InvocationTargetException; 

/** 
* Author: [email protected] 
* DateTime: 2016/10/20 10:17 
*/ 
public class MyBeanUtils { 

    public static void copyPropertiesNotNull(Object dest, Object orig) throws InvocationTargetException, IllegalAccessException { 
     NullAwareBeanUtilsBean.getInstance().copyProperties(dest, orig); 
    } 

    private static class NullAwareBeanUtilsBean extends BeanUtilsBean { 

     private static NullAwareBeanUtilsBean nullAwareBeanUtilsBean; 

     NullAwareBeanUtilsBean() { 
      super(new ConvertUtilsBean(), new PropertyUtilsBean() { 
       @Override 
       public PropertyDescriptor[] getPropertyDescriptors(Class<?> beanClass) { 
        return BeanUtils.getPropertyDescriptors(beanClass); 
       } 

       @Override 
       public PropertyDescriptor getPropertyDescriptor(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
        return BeanUtils.getPropertyDescriptor(bean.getClass(), name); 
       } 
      }); 
     } 

     public static NullAwareBeanUtilsBean getInstance() { 
      if (nullAwareBeanUtilsBean == null) { 
       nullAwareBeanUtilsBean = new NullAwareBeanUtilsBean(); 
      } 
      return nullAwareBeanUtilsBean; 
     } 

     @Override 
     public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { 
      if (value == null) return; 
      super.copyProperty(bean, name, value); 
     } 
    } 
} 
2

Mit PropertyUtils (commons-Beanutils)

for (Map.Entry<String, Object> e : PropertyUtils.describe(parent).entrySet()) { 
     if (e.getValue() != null && !e.getKey().equals("class")) { 
       PropertyUtils.setProperty(anotherParent, e.getKey(), e.getValue()); 
     } 
} 

in Java8:

PropertyUtils.describe(parent).entrySet().stream() 
     .filter(e -> e.getValue() != null) 
     .filter(e -> ! e.getKey().equals("class")) 
     .forEach(e -> { 
     try { 
      PropertyUtils.setProperty(anotherParent, e.getKey(), e.getValue()); 
     } catch (Exception e) { 
      // Error setting property ...; 
     } 
    }); 
Verwandte Themen