2016-07-01 24 views
0

我正在開發一個使用Hibernate Validator進行表單驗證的Spring應用程序。我有一個看起來像這樣的DTO:Hibernate Validator for forms:如何驗證非常相似的DTO的

public class RegisterUserDTO { 


    @Size(min=3) 
    private String inputName; 

    @Email 
    private String inputEmail; 

    @Size(min=3) 
    private String inputPassword; 

    [...] 

} 

其中是必需的。其他地方,我需要使用相同的輸入參數,但驗證略有不同:

public class RegisterUserDTO { 


    @Size(min=3) 
    private String inputName; 

    @Email 
    private String inputEmail; 

    //@Size(min=3) 
    private String inputPassword; 

    [...] 

} 

不是必需的。

如何在兩種情況下使用相同的DTO? 如果這是不可能的,解決這種情況的最乾淨的方法是什麼?

PS_下面的示例使用的DTO在控制器:

@RequestMapping(value = "https://stackoverflow.com/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; 
} 
+0

聽起來你尋找驗證小組。 – chrylis

+0

@chrylis可能是這種情況。你有鏈接嗎? – Tk421

+1

@ Tk421查看Spring MVC驗證組的鏈接:http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html – Pranav

回答

0

解決方案之一是:

public class RegisterUserDTO { 


    @Size(min=3) 
    private String inputName; 

    @Email 
    private String inputEmail; 


    private String inputPassword; 


} 

控制器:

@RequestMapping(value = "https://stackoverflow.com/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; 
} 
+0

它看起來有點工作:)。驗證組看起來更好的選擇,但我還沒有找到神奇的公式。 – Tk421

+0

是的..就像我說的一個解決方案:p ... – FuSsA

0

可以使用休眠-驗證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; 
} 

,這將是很好的,能解決你的問題~~

相關問題