0

私は次の豆を持っています:

public class CodedEntity {
    private String name;
    private String code;
    // getters and setters
}

public class MyProduct {
    @javax.validation.constraints.Size(min = 1)
    private List<CodedEntity> codedEntities;
    // getters and setters
}

ご覧のとおり、codedEntities リストには少なくとも 1 つの要素が必要です。

私のコントローラーでは、次のようにリストのサイズを検証します。

@RequestMapping(value = "/**", method = RequestMethod.POST)
public String submit(@Valid final MyProduct myProduct, final BindingResult result,
        final Model model) {
    // ...
}

そして最後に私の jsp :

<c:forEach items="${codedEntitiesList}" var="codedEntity" varStatus="loopStatus"        
    <form:checkbox path="myProduct.codedEntities[${loopStatus.index}]" value="${codedEntity.code}" cssClass="checkbox" />
</c:forEach>

ここでの問題は次のとおりです。チェックボックスをオンにせずにjspを送信すると、Spring MVCは「null」要素を含む空でないリストを返します。このため、検証は失敗します。

「null」要素でいっぱいのリストではなく、空のリストを返すように spring-mvc に指示するにはどうすればよいですか? または、少なくとも制約を検証できる方法はありますか?

4

2 に答える 2

0

Javascript でこれを行う方が簡単かもしれません。それ以外の場合は、純粋な Java 実装が必要な場合は、独自の注釈を実装します。@ListContainsValue のようなものは、実装がそれほど難しくないはずです。独自の検証アノテーションを実装する方法の例が必要な場合は、次の場所に非常に優れたものがあります。

Hibernate Validator (JSR 303) によるクロス フィールド検証

于 2012-06-12T02:38:52.917 に答える
0

私は最終的に解決策を見つけました。それが最高かどうかはわかりませんが、確かに良いものです。

まず、jsp を次のように変更する必要があります。

<c:forEach items="${codedEntitiesList}" var="codedEntity" varStatus="loopStatus"        
    <form:checkbox path="myProduct.codedEntities" value="${codedEntity}" />
</c:forEach>

カスタムエディターを作成する必要があるよりも:

public class CodedEntityEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(final String text) {
        final CodedEntity codedEntity = new CodedEntity();
        codedEntity.setCode(text);
        this.setValue(codedEntity);
    }

    @Override
    public String getAsText() {
        return ((CodedEntity) this.getValue()).getCode();
    }
}

もちろん、 CodedEntityEditor を Controller にバインドすることを忘れないでください。

@InitBinder
public void initBinder(final WebDataBinder binder) {
    binder.registerCustomEditor(CodedEntity.class, new CodedEntityEditor());
}

最後に、CodedEntity オブジェクトに hashCode() メソッドと equals() メソッドを実装する必要があります。CodedEntityEditor の getAsText メソッドは参照によってオブジェクトを取得するため、これを行う必要があります。これら2つのメソッドを実装すると、特定のフィールド(私の場合は「コード」フィールド)で取得されます。簡単にするために、Eclipse のような IDE を使用してそれらを自動的に生成することをお勧めします。例として、Eclipse によって生成された 2 つのメソッドを次に示します。

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((this.code == null) ? 0 : this.code.hashCode());
    return result;
}

@Override
public boolean equals(final Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (this.getClass() != obj.getClass())
        return false;
    final CodedEntity other = (CodedEntity) obj;
    if (this.code == null) {
        if (other.code != null)
            return false;
    } else if (!this.code.equals(other.code))
        return false;
    return true;
}

もちろん、これら 2 つの方法をスキップすることもできますが、この場合、ページをリロードするときにチェックボックスがチェックされません!

于 2012-06-19T19:41:12.560 に答える