错误消息的顺序不正确

时间:2012-08-04 00:21:29

标签: java spring spring-mvc

在我的春季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>

可以修复吗?

2 个答案:

答案 0 :(得分: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{}

然后在Validation Group界面中,您将成为第一个界面:

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

通过这种方式,帐户名称将首先得到验证

答案 1 :(得分:1)

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