0

私は例外を取得します

org.springframework.beans.NotReadablePropertyException: Invalid property 'entries[0].reason' of bean class [my.company.data.SDROrder]: Bean property 'entries[0].reason' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

次のコード スニペットから:

Errors errors = new BeanPropertyBindingResult(new SDROrder(), "sdr");
orderValidator.validate(order, errors);

バリデータ用:

public class OrderValidator implements Validator
{

    @Override
    public boolean supports(Class<?> clazz)
    {
        return Order.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(final Object target, final Errors errors)
    {
        errors.rejectValue("entries[0].reason", "Wrong Reason");
    }

}

そのようなデータ階層がある場合

public class Order
{
    private List<AbstractOrderEntry> entries;

    public List<AbstractOrderEntry> getEntries()
    {
        return entries;
    }

    public void setEntries(List<AbstractOrderEntry> entries)
    {
        this.entries = entries;
    }
}

public class SDROrder extends Order
{

}

public class AbstractOrderEntry
{

}


public class SDROrderEntry extends AbstractOrderEntry
{
    private String reason;

    public String getReason()
    {
        return reason;
    }

    public void setReason(String reason)
    {
        this.reason = reason;
    }
}

ここで実際の例を参照してください:ここ

更新 1 : 明確にするために。問題は、各要素が実行時に特定の属性を持っているが、コンパイル時には持っていないオブジェクトのコレクションを持つオブジェクトでrejectValueを試みていることです。Spring は Bean のプロパティを使用してこれらのフィールドを解決し、継承された属性を見つけることができません。問題は、Spring が継承されたフィールドを何らかの方法で解決することを説明できるかどうかです。

4

1 に答える 1

0

ここで解決策を見つけました。トリックは

  org.springframework.validation.Errors.pushNestedPath(String)

org.springframework.validation.Errors.popNestedPath()

メソッド。

正しい検証は次のように行う必要があります。

    errors.pushNestedPath("entries[0]");
    errors.rejectValue("reason", "Wrong Reason");
    errors.popNestedPath();
于 2014-05-19T09:43:09.187 に答える