6

昨日は動作していましたが、何かをした後、何時間も修正しようとしてきましたが、もう動作しません。

ユーザーが間違った情報を入力したときに、.properties ファイルから<form:form>カスタム エラー メッセージ ( ) を表示したい を含む Spring MVC アプリがあります。<form:errors>「間違っている」とは、JSR-303 アノテーションで定義されています。

フォームからの抜粋:

<form:form method="post" action="adduserprofile" modelAttribute="bindableUserProfile">
<table>
    <tr>
        <td><form:label path="firstName">Voornaam</form:label></td>
        <td>
            <form:input path="firstName"/>
            <form:errors path="firstName" />
        </td>
    </tr>
    <tr>
        <td><form:label path="lastName">Achternaam</form:label></td>
        <td>
            <form:input path="lastName"/>
            <form:errors path="lastName" />
        </td>
    </tr>

BindableUserProfile からの抜粋:

   @NotNull
@Size(min = 3, max = 40, message="{errors.requiredfield}")
public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@NotNull
@Size(min = 3, max = 40,  message="errors.requiredfield")
public String getLastName() {
    return lastName;
}

コントローラーからの抜粋:

    @RequestMapping(value = "/edit/{userProfileId}", method = RequestMethod.GET)
public String createOrUpdate(@PathVariable Long userProfileId, Model model) {
    if (model.containsAttribute("bindableUserProfile")) {
        model.addAttribute("userProfile", model.asMap().get("bindableUserProfile"));
    } else {
        UserProfile profile = userProfileService.findById(userProfileId);
        if (profile != null) {
            model.addAttribute(new BindableUserProfile(profile));
        } else {
            model.addAttribute(new BindableUserProfile());
        }
    }

    model.addAttribute("includeFile", "forms/userprofileform.jsp");
    return "main";
}

@RequestMapping(value = "/adduserprofile", method = RequestMethod.POST)
public String addUserProfile(@Valid BindableUserProfile userProfile, BindingResult result, Model model) {
    if (result.hasErrors()) {
        return createOrUpdate(null, model);
    }

    UserProfile profile = userProfile.asUserProfile();
    userProfileService.addUserProfile(profile);
    return "redirect:/userprofile";
}

application-context.xml からの抜粋

   <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages/messages"/>
</bean>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource">
        <ref bean="messageSource"/>
    </property>
</bean>

resources/messages には、messages_en.properties と messages_nl.properties の 2 つのファイルがあります。どちらも同じ、単純な内容です。

errors.requiredfield=This field is required!!!
  • 空の名前でフォームを送信すると、コントローラ メソッド 'addUserProfile()' でエラーが実際に見つかったことがわかります。
  • 空の名前でフォームを送信すると、フィールドの横にメッセージ識別子が表示されます。つまり、姓の場合は「errors.requiredfield」または「{errors.requiredfield}」というリテラル テキストです。
  • メッセージ属性の値を「Foo」に変更すると、「Foo」がエラー メッセージとして表示されます。したがって、エラーメカニズム自体は正常に機能しているようです。
  • ベース名を変更すると、プロパティ ファイルが見つからないと表示されるため、application-context.xml の messageSource Bean は正しくなければなりません。
  • 空の入力は、NotNull 注釈によってキャッチされません。Spring は、空の入力を null ではなく空の文字列と見なします。

したがって、プロパティ ファイルが見つかり、検証アノテーションが適切に処理されているように見えますが、Spring は、メッセージ キーをプロパティ ファイルからのメッセージに置き換える必要があることを理解していません。

4

2 に答える 2

3

やあああ、これはそもそもうまくいくはずがなかったと思う。

message.properties ファイルから関連するエラー メッセージを取得するために、JSR-303 アノテーションの「メッセージ」属性をキーとして解釈することは可能だと思いましたが、それは間違っていると思います。

@Size(min = 3, max = 40, message="errors.requiredfield")

職場の同僚が、この動作を作成するレイヤーをプログラムしましたが、デフォルトでは機能しません。使用していたので、一度動作したように見えました

@Size(min = 3, max = 40, message="{errors.requiredfield}")

中括弧により、Spring は .properties ファイルをソースとして使用する検索と置換の手順を開始しました。ただし、この2番目のオプションは引き続き機能しました。

于 2012-07-27T15:05:01.103 に答える
2

私は過去1.5日から同じことをしてきましたが、最終的にその解決策を見つけました。

少しクレイジーに聞こえるかもしれませんが、実用的なソリューションです。:)

@Size(min = 1, max = 50, message = "Email size should be between 1 and 50")

message = "Email size should be between 1 and 50"検証タグから削除します。

これを行うと、注釈は次のようになります。

@Size(min = 1, max = 50)

コントローラー側で、フォームの送信時に呼び出されるメソッドをデバッグします。以下は、ユーザーが送信を押したときにリクエストを受け取る私のメソッドです。

public static ModelAndView processCustomerLoginRequest(IUserService userService, LoginForm loginForm, 
        HttpServletRequest request, HttpSession session, BindingResult result, String viewType, Map<String, LoginForm> model)

ここで、メソッドの最初の行にデバッグ ポイントを配置し、引数 "result" をデバッグします。

BindingResult result

デバッグ中に、コード配列にこのような文字列が見つかります。

Size.loginForm.loginId

次に、プロパティ ファイルでこの文字列を定義し、その文字列に対するメッセージを定義します。コンパイルして実行します。その注釈が検証されない場合は常に、そのメッセージが表示されます。

Size.loginForm.loginId=email shouldn't be empty.

基本的に、Spring は独自の文字列をプロパティ ファイル メッセージのキーとして作成します。上記のキーで:

  • Size(@Size)= 検証アノテーション名
  • loginForm= 私のクラス名
  • loginIdloginForm=クラス内のプロパティ名。

この方法の優れた点は、Spring Internationalization を使用している間も問題なく動作することです。言語が変わると、メッセージ ファイルが自動的に切り替わります。

于 2013-12-05T03:56:17.627 に答える