8

私の春の MVC 検証では、エラー メッセージの順序がランダムに変わります。メッセージがページに表示される順序と同じになるようにしたいと思います。

私の AccountForm.java クラスは次のようになります。

@NotNull(message = "Account name cannot be empty.")
@Size(min=3, max=50, message="Account name must be between 3 and 50 characters long.")
private String accountName;

@NotNull(message = "Company name cannot be empty.")
@Size(min=3, max=50, message="Company name must be between 3 and 50 characters long.")
private String companyName;

また、コントローラーにいくつかのカスタム エラーを追加します。

   public ModelAndView create(@Valid AccountForm accountForm, BindingResult bindingResult) {

    ModelAndView mav = new ModelAndView("accounts/new");
    mav.addObject("errors", bindingResult.getAllErrors());
    mav.addObject("accountForm", accountForm);

    if (!bindingResult.hasErrors()) {
        if(accountService.findByAccountName(accountForm.getAccountName()) != null) {
            bindingResult.addError(new ObjectError("accountName", "Account name is already is use"));
        }
        ..
        ..
    }

    if(bindingResult.hasErrors() {
      return mav;
    }

    ..

フォームで送信を押すと、メッセージの順序が変わり続けます。

以下を使用して、ビューにエラーをレンダリングします。

        <#list errors as error>
            <li>${error.defaultMessage}</li>
        </#list>

これは修正できますか?

4

2 に答える 2

4

これは検証グループを介して実現され、Spring はそれをサポートします。@Validアノテーションを使用していますが、検証グループを使用するには@Validatedである必要があります。

 public ModelAndView submitSearch(@Validated(value={OrderChecks.class}) @ModelAttribute("SearchStringBackingObject") final SearchStringBackingObject backingObject

OrderChecks.class:

 @GroupSequence(value={NotEmptyGroup.class, LengthCheckGroup.class, DiacriticeCheckGroup.class, EmailValidationGroup.class, EmailLengthValidationGroup.class,
    Email3EntriesValidationGroup.class, EntityAlreadyExistsValidatorGroup.class, Default.class})
 public interface OrderChecks {}

そして、バッキング オブジェクト内:

 @NotBlank(groups=NotEmptyGroup.class)
@Length(max=25, groups=LengthCheckGroup.class)
@DiacriticeCheck(groups=DiacriticeCheckGroup.class)
private String firstname="";

@GroupSequence の各エントリはインターフェイスです。

編集

したがって、アカウント名を最初に検証する場合は、そのためのインターフェイスを作成します。

public interface AccountNameGroup{}

次に、検証グループ インターフェイス内で、これが最初のインターフェイスになります。

@GroupSequence(value={AccountNameGroup.class, the rest of groups})
public interface OrderOfGroups{}

And of course inside the Controller you specify the @Validated annotation with the OrderOFGroups interface.

このようにして、アカウント名が最初に検証されます

于 2012-08-04T06:51:12.417 に答える
1

私も同じ問題に直面し、多くのことを試しました。JSR-303でこれを行う標準的な方法があると思います。
これは、グループ(個人的には好きではありません) を使用するか、<form:error>必要なシーケンスを定義することで実現できます。

于 2012-08-04T05:09:56.633 に答える