2016-07-01 1 views
0

폼 유효성 검사를 위해 Hibernate Validator를 사용하여 Spring 어플리케이션을 개발 중이다. 이폼에 대한 Hibernate Validator : 매우 유사한 DTO의 유효성을 검사하는 방법

public class RegisterUserDTO { 


    @Size(min=3) 
    private String inputName; 

    @Email 
    private String inputEmail; 

    @Size(min=3) 
    private String inputPassword; 

    [...] 

} 

필요합니다 :이처럼 보이는 DTO 있습니다. 다른 곳에서, 나는 같은 입력 매개 변수를 사용해야하지만 검증은 약간 다릅니다 :

public class RegisterUserDTO { 


    @Size(min=3) 
    private String inputName; 

    @Email 
    private String inputEmail; 

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

    [...] 

} 

이 필요하지 않습니다.

두 시나리오에 동일한 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

예 .. 내가 솔루션 중 하나를 말했습니다 : 피 ... – FuSsA

0

당신은 최대 절전 모드 - 유효성 검사를 사용할 수 있습니다

PS_ 다음의 예는 컨트롤러에 DTO를 사용 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; 
} 

은, ~~ 당신에게

관련 문제