[英]Hibernate Validator for forms: how to validate very similar DTO's
我正在開發一個使用Hibernate Validator進行表單驗證的Spring應用程序。 我有一個如下所示的DTO:
public class RegisterUserDTO {
@Size(min=3)
private String inputName;
@Email
private String inputEmail;
@Size(min=3)
private String inputPassword;
[...]
}
需要inputPassword
地方。 在其他地方,我需要使用相同的輸入參數,但驗證稍有不同:
public class RegisterUserDTO {
@Size(min=3)
private String inputName;
@Email
private String inputEmail;
//@Size(min=3)
private String inputPassword;
[...]
}
inputPassword
。
如何在兩種情況下使用相同的DTO? 如果這不可能,解決此問題的最干凈方法是什么?
PS_以下示例在控制器中使用DTO:
@RequestMapping(value = "/users/add", method = RequestMethod.POST)
public String saveUser(ModelMap model, @Valid RegisterUserDTO registerUserDTO, BindingResult result) {
String template = "/path/to/addUser";
if (result.hasErrors()) {
User user = new User(registerUserDTO.getInputName(), registerUserDTO.getInputPassword(), registerUserDTO.getInputEmail());
model.addAttribute("user", user);
model.addAttribute("errors", result.getFieldErrors());
} else {
User user = userService.insertUser(registerUserDTO.getInputEmail(), registerUserDTO.getInputName(), registerUserDTO.getInputPassword());
template = "redirect:/path/to/edit/users/" + user.getId();
}
return template;
}
解決方案之一是:
public class RegisterUserDTO {
@Size(min=3)
private String inputName;
@Email
private String inputEmail;
private String inputPassword;
}
控制器:
@RequestMapping(value = "/users/add", method = RequestMethod.POST)
public String saveUser(ModelMap model, @Valid RegisterUserDTO registerUserDTO, BindingResult result) {
String template = "/path/to/addUser";
if (result.hasErrors()) {
User user = new User(registerUserDTO.getInputName(), registerUserDTO.getInputPassword(), registerUserDTO.getInputEmail());
model.addAttribute("user", user);
model.addAttribute("errors", result.getFieldErrors());
return template;
}
//when inputPassword is required add your test
if(your condition){
FieldError error = new FieldError("registerUserDTO","inputPassword","Your message...");
result.addError(error);
return template;
}
User user = userService.insertUser(registerUserDTO.getInputEmail(), registerUserDTO.getInputName(), registerUserDTO.getInputPassword());
template = "redirect:/path/to/edit/users/" + user.getId();
return template;
}
您可以使用hibernate-validate group
,例如:
public class ACValidTestVO {
@NotEmpty(message = "{ACValidTestVO.acId.notempty}", groups = {PrimaryKeyGroup.class})
private String acId;
@NotBlank(message = "{ACValidTestVO.mysqlVarchar.notblank}", groups = {EntityGroup.class})
@Length(min = 1, max = 255, message = "{ACValidTestVO.mysqlVarchar.length}", groups = {EntityGroup.class})
private String mysqlVarchar;//字符串
@NotEmpty(message = "{ACValidTestVO.mysqlChar.notempty}", groups = {EntityGroup.class})
private String mysqlChar;//字符
@NotEmpty(message = "{ACValidTestVO.mysqlBlob.notempty}", groups = {EntityGroup.class})
private String mysqlBlob;//二進制大對象
private String mysqlText;//文本
@Min(value = -2147483648, message = "{ACValidTestVO.mysqlInt.min}", groups = {EntityGroup.class})
@Max(value = 2147483647, message = "{ACValidTestVO.mysqlInt.max}", groups = {EntityGroup.class})
private String mysqlInt;//整形
private String mysqlTinyint;//小整形
private String mysqlSmallint;//短整形
private String mysqlMediumint;//中整形
private String mysqlBigint;//大整形
private String mysqlBit;//比特
@Digits(integer = 2, fraction = 2, message = "{ACValidTestVO.mysqlFloat.digits}", groups = {EntityGroup.class})
private String mysqlFloat;//浮點型
private String mysqlDouble;//雙精度型
private String mysqlDecimal;//小數
private String mysqlBoolean;//布爾型
private String mysqlDate;//日期
private String mysqlTime;//時間
private String mysqlDatetime;//日期時間
private String mysqlTimestamp;//時間戳
private String mysqlYear;//年
}
因此,不同的控制器可以使用不同的組進行驗證,例如:
@RequestMapping("/save")
public ACResponseMsg save(@Validated({EntityGroup.class}) @RequestBody ACValidTestVO vo, BindingResult bindingResult) {
ACResponseMsg msg = new ACResponseMsg();
try {
dataService.save(vo);
msg.errcode = ACErrorMsg.CALL_SUCCESS.errcode;
msg.errmsg = ACErrorMsg.CALL_SUCCESS.errmsg;
} catch (ACServiceException e) {
msg = e.getAcErrorMsg().toResponseMsg();
} catch (ACDaoException e) {
msg = e.getAcErrorMsg().toResponseMsg();
} catch (ACRuntimeException e) {
msg = e.getAcErrorMsg().toResponseMsg();
}
return msg;
}
那會很好,可以解決你的問題~~
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.