2010-12-10 9 views
2

Ich habe die folgende Klasse:BeanUtils.copyProperties ignorieren Nullwerte

import org.apache.commons.beanutils.BeanUtils; 
import com.thoughtworks.xstream.XStream; 
... 

public class MyBean { 
    protected static final XStream XSTREAM = new XStream(new DomDriver()); 

    protected String name; 
    protected Something something; 

    public MyBean() { 
     something = new Something(); 
    } 

    public MyBean(String xml) { 
     this(); 
     MyBean beanFromXML = (MyBean) XSTREAM.fromXML(new StringReader(xml)); 
     BeanUtils.copyProperties(this, beanFromXML); 
    } 

    public String toString() { 
     return XSTREAM.toXML(this); 
    } 

    // Getters and setters... 
} 

Es ist eine Bohne mit der Fähigkeit zu/von XML mit XStream zu serialisiert und deserialisiert.

Ich habe auch einen Nicht-Args-Konstruktor hinzugefügt, der something initialisiert, um Nullzeigerfehler zu vermeiden - die Bean ist tatsächlich viel komplexer, und ich möchte nicht überprüfen "ist something != null?" eine Million Mal.

Das Problem tritt auf, wenn ich den XML-Konstruktor verwende. Lets sagen, dass ich das folgende XML haben:

<myBean> 
    <name>John</name> 
</myBean> 

Dies ist, was würde ich den Konstruktor gerne tun:

name: "John"; 
something: new Something(); 

Da es jedoch kein <something> Element in der XML ist, BeanUtils.copyProperties Marken something = null;, also das, was ich bekommen ist:

name: "John" 
something: null 

Wie kann ich beanFromXML ‚s Eigenschaften in this kopieren ... aber ignorieren die nul l Eigenschaften, anstatt sie zu überschreiben?

Antwort

3

Sie können einen benutzerdefinierten Konverter erstellen, die einen Standardwert für null Eigenschaften erzeugt:

public class MyNullConverter implements Converter { 
    @Override 
    public Object convert(final Class type, final Object value) { 
    try { 
     return value == null ? type.newInstance() : value; 
    } catch (final InstantiationException e) { 
     return null; 
    } catch (final IllegalAccessException e) { 
     return null; 
    } 
    } 
} 

registrieren Sie es dann für Bean-Klassen Sie standardmäßig wollen (leer) Werte:

ConvertUtils.register(new MyNullConverter(), Something.class); 

Ihr Code wird jetzt funktionieren. Das Einzige, was Sie vielleicht ärgern könnte, ist, dass Ihr Etwas zweimal initialisiert wird. Weiß nicht, ob das OK ist ...

BTW, wenn Sie eine feinere Kontrolle über den Prozess wünschen: Verwenden Sie stattdessen BeanUtilsBean, PropertyUtilsBean und ConvertUtilsBean.

+0

Ich werde es versuchen (aber es wird bis nächsten Montag warten müssen: D). Da die Initialisierung zweimal stattfindet, ist das kein Problem, aber es muss leicht zu lösen sein. Vielen Dank!!! :) – AJPerez

+0

Großartig, es funktioniert jetzt. Danke nochmal für deine Hilfe! :) – AJPerez

0

Sie verfügen über xstream-Aliasmethoden, um einen Eigenschaftennamen der Klasse zuzuordnen. Der Link wird viel hilfreicher http://x-stream.github.io/alias-tutorial.html

+0

Das ist nicht, was das OP fragte .... Frage ist 'Wie kann ich BeanFromXML-Eigenschaften in diese ... kopieren, aber die NULL-Eigenschaften ignorieren, anstatt sie zu überschreiben?'. –

Verwandte Themen