Commons beanUtilsの使用どのコンバーターにも、Dateconverterにnull値を無視し、デフォルトとしてnullを使用するように依頼する方法を知りたいです。例として、パブリッククラスを考えてみましょう。
public class X {
private Date date1;
private String string1;
//add public getters and setters
}
そして私のconvertertestは、
public class Apache {
@Test
public void testSimple() throws Exception {
X x1 = new X(), x2 = new X();
x1.setString1("X");
x1.setDate1(null);
org.Apache.commons.beanutils.BeanUtils.copyProperties(x2, x1);
//throws ConversionException
System.out.println(x2.getString1());
System.out.println(x2.getDate1());
}
}
日付がたまたまnullであるため、上記はNPEをスローします。これは、デフォルトで処理する必要がある非常に原始的なシナリオに見えます(たとえば、x2のdate1の値はnullであると予想されます)。ドコは私に converter にこれをするように頼むことができると言っています。誰かがこれを行うための最良の方法について私に指摘できますか?
ConverterとisUseDefault()をtrueにしたくないのは、すべてのDate、Enum、および他の多くのコンバーターに対してそれを実行する必要があるためです。
どうやらそれは、ConvertUtilsにnull値に例外をスローしないように指示する方法があります。これは呼び出すことによって達成されます
BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
最善の解決策は、BeanUtils 1.9.0にアップデートすることです。これは、この問題がここで確認できるように修正されているためです https://issues.Apache.org/jira/browse/BEANUTILS-454
少し遅れるかもしれませんが、DateConverterを登録できるようです https://issues.Apache.org/jira/browse/BEANUTILS-387
最近この問題が発生し、このエラーを回避するために変数を文字列に変換し、必要に応じて日付に戻しました。最も洗練されたソリューションではありませんが、単純にするため、およびこのような問題を回避するために、これは実行可能なソリューションです。もう1つの注意点は、クラスが読み込まれる前にBeanUtilsがメソッドを起動することでした。そのため、カスタムクラスローダーを使用した問題に対するより複雑な解決策ではなく、これを選択しました。
ちなみに、バージョン1.8.0より前は、BeanUtils自体はこれらのnull値を無視していました。
詳細な説明については、次のリンクを参照してください。 フィールドがnull値のJava.util.Dateの場合、「Date」に値が指定されていません 。
次のように、Beanにnull値を設定するような単純なケースには少し驚いています。
BeanUtils.setProperty(pojo, "date", null);
上記のように、クラッシュ動作を引き起こします。
それが価値があるものについては、ここに私の回避策があります:
import org.Apache.commons.beanutils.BeanMap;
BeanMap beanMap = new BeanMap(pojo);
Method writeMethod = beanMap.getWriteMethod("date");
writeMethod.invoke(pojo, null);