簡體   English   中英

表單的Hibernate Validator:如何驗證非常相似的DTO

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM