9

例えば

class tester
{
    @Test
    public void testBeanUtils() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException
    {
        Stranger stranger = new Stranger();
        BeanUtils.setProperty(stranger,"name","wener");
        BeanUtils.setProperty(stranger,"xname","xwener");
        BeanUtils.setProperty(stranger,"yname","ywener");

        System.out.println(stranger);
    }
    @Data// lombok annotation generate all setter and getter
    public static class Stranger
    {
        @Accessors(chain = true)// generate chained setter
        String name;
        String xname;
        String yname;

        public Stranger setYname(String yname)// no lombok, still not work
        {
            this.yname = yname;
            return this;
        }
    }
}

私の出力:

TestValues.Stranger(name=null, xname=xwener, yname=null)

これの何が問題なのですか?チェーンセッターいいですね。何か提案はありますか?

編集

再びこの問題に戻ります。今回は削除できませんAccessors chain。今、私はcommons-lang3達成するために を使用します。

// force access = true is required
Field field = FieldUtils.getField(bean.getClass(), attrName, true);
field.set(bean,value);

同じ問題を抱えている人のために。

4

3 に答える 3

9

それは簡単です:BeanUtilsかなり奇妙で、Introspector以下を使用します:

BeanUtils.setPropertyいくつかの例外を宣言していますが、設定するプロパティが存在しないことを黙って無視しているようです。究極の犯人は、セッターの空性Introspectorを単に必要とする です。

私はそれを設計上壊れたと呼んでいますが、YMMV. それは古いクラスであり、流暢なインターフェイスは当時の暗黒時代にはまだ発明されていませんでした。Accessors(chain=false)連鎖を無効にするために使用します。


さらに重要: source を使用します。それを入手し、デバッガー (既に IDE に含まれています) を入手して、自分で見つけてください (うまくいかない場合は、お気軽にお問い合わせください。もう少し頑張ってみてください)。

于 2014-03-30T14:01:19.977 に答える