错误消息的顺序不正确

在我的春季MVCvalidation中,我的错误消息的顺序随机变化,我希望消息的顺序与它们在页面上显示的顺序相同。

我的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; } .. 

当我在表单上点击提交时,消息的顺序不断变化。

我使用以下方法在视图中渲染错误:

   
  • ${error.defaultMessage}
  • 这可以修复吗?

    这是通过validation组实现的,Spring支持它。 您正在使用@Valid注释,但它应该是@Validated才能使用validation组:

      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中的每个条目都是一个接口。

    编辑

    因此,如果您希望首先validation帐户名称,则为其创建一个接口:

     public interface AccountNameGroup{} 

    然后在validation组界面中,您将成为第一个界面:

     @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. 

    这样,帐户名称将首先得到validation

    我也面临同样的问题,并尝试了很多。 我认为现在有标准的方法在JSR-303中这样做。
    这可以使用组 (我个人不喜欢)或通过定义是期望的序列来实现。