2015-01-15 2 views
2

Как получились @Valid аннотации не поймать мои JSR-303 аннотаций изначально, но поймать их, используя следующий метод:JSR-303 ошибки не обнаружены изначально с помощью @Valid аннотации

WebConfig.java

@Bean 
public ResourceBundleMessageSource messageSource() { 

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 

    String[] strBaseNames = { 
      "resources.messages.layout.LayoutResources", 
      "resources.messages.layout.MenuResources", 
      "resources.messages.global.GlobalResources" 
    }; 

    messageSource.setUseCodeAsDefaultMessage(true); 
    messageSource.setDefaultEncoding("UTF-8"); 
    messageSource.setBasenames(strBaseNames); 

    return messageSource; 
} 

@Bean 
public LocalValidatorFactoryBean jsr303Validator() { 

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
    localValidatorFactoryBean.setValidationMessageSource(this.messageSource()); 

    return localValidatorFactoryBean; 
} 

UserController.java

@Controller 
@RequestMapping(value = "/security/user", method = RequestMethod.GET) 
public class UserController { 

@Autowired 
private SecurityService securityService; 

@Autowired 
SessionObject sessionObject; 

@Autowired 
@Qualifier("jsr303Validator") Validator validator; 

@RequestMapping(value = "/edit/validate", method = RequestMethod.POST) 
public String validateEdit(@ModelAttribute @Valid User user, 
          BindingResult result, 
          Model model) { 

    String strViewName = "common/error"; 

    validator.validate(user, result); 

    if(result.hasErrors()) { 
     strViewName = "user/userEdit"; 
    } else { 
     ... update work ... 
     strViewName = "user/success"; 
    } 

    return strViewName; 
} 

Ресурс: http://www.wenda.io/questions/2462924/convert-jsr-303-validation-errors-to-springs-bindingresult.html

Если я использую только аннотацию @Valid, result.hasErrors() всегда пуст, поэтому я получаю исключение ConstraintViolationException (см. Ниже), которое ожидается. Но я хотел бы, чтобы он работал с использованием аннотации @Valid, без необходимости автоподготовки моего компонента jsr303validator в каждом контроллере, я хочу реализовать некоторые проверки JSR-303.

Constraint журнал Нарушение трассировки

Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [spring4base.model.security.User] during update time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
ConstraintViolationImpl{interpolatedMessage='error.firstname.notnull', propertyPath=strFirstName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.firstname.notnull'} 
ConstraintViolationImpl{interpolatedMessage='error.userid.notnull', propertyPath=strUserId, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.userid.notnull'} 
ConstraintViolationImpl{interpolatedMessage='error.lastname.notnull', propertyPath=strLastName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.lastname.notnull'} 

]

User.java

@NotBlank(message = "error.userid.notnull") 
@Size(min = 0, max = 14, message = "error.firstname.length") 
private String strUserId = ""; 

@NotBlank(message = "error.firstname.notnull") 
@Size(min = 0, max = 50, message = "error.firstname.length") 
private String strFirstName = ""; 

@NotBlank(message = "error.lastname.notnull") 
@Size(min = 0, max = 50, message = "error.lastname.length") 
private String strLastName = ""; 

Спасибо

+0

Вы когда-нибудь решали это? – Stewart

+0

Да, отправляя решение сразу. –

ответ

0

Следующая требуется для того, чтобы он работал в моем случае:

Сначала определите LocalValidatorFactoryBean в моем классе Java Config (в моем случае - WebAppContext.java).

@Bean 
public ResourceBundleMessageSource messageSource() { 

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 

    String[] baseNames = { 
      "resources.messages.layout.LayoutResources", 
      "resources.messages.layout.MenuResources", 
      "resources.messages.option.AppConfigResources", 
      "resources.messages.global.GlobalResources", 
      "resources.messages.contact.ContactResources", 
      "resources.messages.currentsession.CurrentSessionResources", 
      "resources.messages.welcome.WelcomeResources", 
      "resources.messages.user.UserResources", 
      "resources.messages.role.RoleResources", 
      "resources.messages.profile.ProfileResources" 
    }; 

    messageSource.setCacheSeconds(60); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setUseCodeAsDefaultMessage(true); 
    messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name()); 
    messageSource.setBasenames(baseNames); 

    return messageSource; 
} 


@Bean 
public LocalValidatorFactoryBean jsr303Validator() { 

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
    localValidatorFactoryBean.setValidationMessageSource(this.messageSource()); 

    return localValidatorFactoryBean; 
} 

Затем в мой контроллер, я autowire, что валидатор так:

@Autowired 
private Validator jsr303Validator; 

И тогда единственный способ, который я нашел, чтобы получить мой JSR-303 выполнен, чтобы запустить их вручную, например:

@RequestMapping(value = "/update", method = RequestMethod.POST) 
public String processUpdate(@ModelAttribute UserForm userForm, 
          BindingResult result, 
          RedirectAttributes redirectAttributes, 
          SessionStatus status) throws CheckedPersistenceException { 

    this.userFormValidator.validate(userForm, result); 

    if (!result.hasErrors()) { 
     this.jsr303Validator.validate(userForm, result); 
    } 

    if(result.hasErrors()) { 
     return this.UPDATE_VIEW; 
    } 

    ... 
} 
+2

Но разве это не то, что у вас было в вопросе? – Stewart

Смежные вопросы