2

私は次のクラスを持っています:

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...
}

これは、XStream を使用して XML との間でシリアル化および逆シリアル化する機能を備えた Bean です。

null ポインター エラーを回避するために、を初期化する非引数コンストラクターも追加しました。実際には、Bean はもっと複雑で、「is ?」somethingをチェックしたくありません。something != null百万回。

XML コンストラクターを使用すると、問題が発生します。次の XML があるとします。

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

これは、コンストラクターに実行してもらいたいことです。

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

ただし、<something>XML には要素がないため、BeanUtils.copyProperties はsomething = null;次のようになります。

 name: "John"
 something: null

beanFromXMLのプロパティを...にコピーするにはどうすればよいthisですか?ただし、null プロパティを上書きするのではなく無視しますか?

4

2 に答える 2

3

null プロパティのデフォルト値を作成するカスタム コンバーターを作成できます。

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

次に、デフォルト (空の) 値が必要な Bean クラスに登録します。

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

コードが機能するようになります。あなたを悩ませる唯一のことは、あなたの何かが2回初期化されることです。これでいいのかわからない…

ところで、プロセスをより細かく制御したい場合は、代わりに BeanUtilsBean、PropertyUtilsBean、および ConvertUtilsBean を使用してください。

于 2010-12-10T14:38:18.163 に答える
0

プロパティ名をクラスにマップする xstream エイリアス メソッドがあります。次のリンクは、はるかに役立ちます http://x-stream.github.io/alias-tutorial.html

于 2010-12-10T13:53:39.523 に答える