Bla*_*man 7 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;
Run Code Online (Sandbox Code Playgroud)
我还在控制器中添加了一些自定义错误:
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;
}
..
Run Code Online (Sandbox Code Playgroud)
当我在表单上点击提交时,消息的顺序不断变化.
我使用以下方法在视图中渲染错误:
<#list errors as error>
<li>${error.defaultMessage}</li>
</#list>
Run Code Online (Sandbox Code Playgroud)
这可以修复吗?
这是通过验证组实现的,Spring 支持它。您正在使用@Valid注释,但它应该是@Validated才能使用验证组:
public ModelAndView submitSearch(@Validated(value={OrderChecks.class}) @ModelAttribute("SearchStringBackingObject") final SearchStringBackingObject backingObject
Run Code Online (Sandbox Code Playgroud)
订单检查类:
@GroupSequence(value={NotEmptyGroup.class, LengthCheckGroup.class, DiacriticeCheckGroup.class, EmailValidationGroup.class, EmailLengthValidationGroup.class,
Email3EntriesValidationGroup.class, EntityAlreadyExistsValidatorGroup.class, Default.class})
public interface OrderChecks {}
Run Code Online (Sandbox Code Playgroud)
在支持对象内部:
@NotBlank(groups=NotEmptyGroup.class)
@Length(max=25, groups=LengthCheckGroup.class)
@DiacriticeCheck(groups=DiacriticeCheckGroup.class)
private String firstname="";
Run Code Online (Sandbox Code Playgroud)
其中 @GroupSequence 中的每个条目都是一个接口。
编辑
因此,如果您希望首先验证帐户名,那么您可以为其创建一个接口:
public interface AccountNameGroup{}
Run Code Online (Sandbox Code Playgroud)
然后在验证组界面中,这将是第一个界面:
@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.
Run Code Online (Sandbox Code Playgroud)
这样帐户名将首先被验证