2017-03-29 6 views
3

JSR-303バリデーションを使用して、その結果をjspページに表示しようとしています。ここで示しjspページのコード片があるエラー:フォーム:errorsタグ付きスプリングJSR-303

@PostMapping(params = "next") 
public String next(@Valid @ModelAttribute(COMMAND_NAME) final ProjectNewDetailsCommand cmd, 
        final Errors errors, 
        final Model model, 
        final HttpServletRequest request) { 

まず、私のために働いたソリューションは、カスタムValidatorクラスを書いている:私は次のように持っているコントローラで

<c:set var="Error"> 
    <form:errors path="name"/> 
</c:set> 
... 
<spring:transform value="${Error}"/> 

@Override 
public void validate(Object o, Errors errors) { 
    errors.pushNestedPath("project"); 
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "error.project.creation.name.required"); 
    errors.popNestedPath(); 
} 

この場合、messages.propertiesからの適切なメッセージが適用され、UI:

に表示されますここ
error.project.creation.name.required=The name must not be blank. 

私はJSR-303のアノテーションを使用する場合、別のケースである:messages.properties

public class Project { 

    ... 
    @Size(max = 100, message = "error.project.creation.size") 
    private String name; 

キーerror.project.creation.size下のメッセージがあるが、私もそれはいくつかの中で述べられていますように、キーSize.command.project.nameにメッセージを追加しようとしましたがソースのコントローラ内のErrorオブジェクトも空ではなく、検証エラーが含まれています。

Caused by: javax.servlet.jsp.JspTagException: No message found under code 'Size' for locale 'en_US'. 
    at org.springframework.web.servlet.tags.MessageTag.doEndTag(MessageTag.java:200) 

何らかの理由でSpring代わりerror.project.creation.sizeまたはSize.command.project.nameSizeエラーコードを適用しようとしていることを意味:私はJSR-303で、このアプローチを使用する場合でも、私は次のエラーを得ました。なぜこれが起こっているのか、これを修正する方法は?

+0

を私は 'error.projectに一致するように、' 'メッセージ= "{error.project.creation.sizeを}" 書かれるべきだと思います。 creation.size' –

+0

私もこれを試しました。私のために働かなかったので、私はいくつかの他の問題があると思う。 –

+0

これを試してみると、Errorオブジェクトの内容は何ですか?メッセージは存在しましたか? –

答えて

1

最後に、問題の原因を見つけることができました。以下のように動作している場合

<spring:message code="${error.code}" arguments="${error.arguments}"/> 

:アラートをレンダリングするためのコードでは、spring:messageタグがあった、それはErrorsクラスのcodes配列から最後のコードを探します(DefaultMessageSourceResolvable.getCode方法を参照)、それはcouldn理由ですt Sizeメッセージを見つけ、hibernateバリデーターまたはカスタムのもので作成されたdefaultMessageを取得しませんでした。この場合、簡単な修正はtext属性を追加することでした

<spring:message code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/> 
関連する問題