2010-11-26 2 views
7

Я создал класс bean и использую его в своем контроллере, но он, похоже, не работает. А именно, хотя я ввожу недопустимый возраст, result.hasErrors по-прежнему является ложным.Весенний портлет mvc: @Valid не работает

Bean класс:

public class User{ 
    @Min(13) 
    private int age; 
    private String name; 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public String getName(){ 
      return name; 
    } 

    public void setName(String name){ 
      this.name = name; 
    } 
} 

контроллер фрагмент кода:

@ActionMapping(params = "myAction=validateUser") 
    public void validateUser(ActionRequest request, ActionResponse response, ModelMap model, @ModelAttribute("user") @Valid User user, BindingResult result){  

     if(result.hasErrors()){ 
      for(ObjectError oe : result.getAllErrors()){ 
       System.out.println(oe.getDefaultMessage()); 
      } 
     } else{ 
      //code 
     } 
    } 

JSP:

<form:form action="${registerUser}" method="post" commandName="user"> 
    <b>User</b> 
    <form:input path="age"/> 
    <form:input path="name"/> 
    <input type="submit" value="register"/> 
</form:form> 

редактировать: My-portlet.xml Регистрация пользователя:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util-3.0.xsd 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/mvc 
     "> 

    <mvc:annotation-driven /> 

    <import resource="spring-hibernate.xml"/> 

    <context:component-scan base-package="comjohndoe.dao" /> 
    <context:component-scan base-package="comjohndoe.model" /> 
    <context:component-scan base-package="comjohndoe.service" /> 
    <context:component-scan base-package="comjohndoe.util" /> 
    <context:component-scan base-package="comjohndoecontroller" /> 

    <bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/jsp/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 
</beans> 

Это линия проверки весов mvc: дала мне ошибку: cvc-complex-type.2.4.c the matching wildcard is strict, but no declaration can be found for the element mvc:annotation-driven..

ответ

4

Для включения проверки jsr-303 необходимо <mvc:annotation-driven />. Если вы не хотите использовать его по какой-то причине, или если в какой-то момент он начинает создавать проблемы (как это было для меня), посмотрите на this question

Update: в schemaLocation запись должна MVC содержать эти два:

http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
+0

Спасибо за совет, я попробовал разместить его у моего пользователя Registration-portlet.xml, но я получаю: префикс mvc для mvc: annotation-driven не определен. Но когда я google , я не вижу различий? – jack 2010-11-26 08:41:04

+0

Редактировать: Добавлено: xmlns: mvc = "http://www.springframework.org/schema/mvc", и я также добавил: http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd к моей схеме. И теперь я получаю ошибку: соответствующий шаблон является строгим, но для элемента mvc: annotation-driven не найдено объявления. Извините за двойной пост, но мой интернет очень медленный. Поэтому я мог бы также пропустить некоторые ответы. – jack 2010-11-26 08:46:45

+0

Я думаю, что, возможно, мне не хватает зависимостей от maven, но я не могу думать об этом. – jack 2010-11-26 08:54:27

0

Я думаю, что причина в том, что ServletRequestDataBinder (распространяется DataBinder) не имеет org.springframework.validation.Validator экземпляра, поэтому он ничего не проверяет (для проверки @Valid аннотированного боба вы должны иметь экземпляр javax.validation.Validator) ,

org.springframework.validation.DataBinder

public void validate() { 
      Validator validator = getValidator(); 
      if (validator != null) { 
       validator.validate(getTarget(), getBindingResult()); 
      } 
     } 

Вы можете установить экземпляр Validator в @InitBinder аннотированных методов: -

@InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.setValidator(new MyValidator()); 
    } 

Yo можно также установить экземпляр валидатор в WebBindingInitializer.

StandardBindingInitializer

public class StandardBindingInitializer implements WebBindingInitializer { 
     @Autowired 
     private LocalValidatorFactoryBean validator; 
     public void setValidatorFactory(LocalValidatorFactoryBean validator) { 
      this.validator = validator; 
     } 

     @Override 
     public void initBinder(WebDataBinder binder, WebRequest request) { 
      binder.setValidator(validator); 
    } 
} 

Чтобы создать экземпляр LocalValidatorFactoryBean либо использовать mvc:annotation-driven ИЛИ set up LocalValidatorFactoryBean as bean.

8

У меня была такая же проблема. Я читал https://jira.springframework.org/browse/SPR-6817 и работал проблемы вокруг, добавляя к моей конфигурации:

<mvc:annotation-driven validator="validator" /> 

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 

<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean id="configurableWebBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="validator"> 
       <ref bean="validator"/> 
      </property> 
     </bean> 
    </property> 
</bean> 

Вы также должны иметь валидатор JSR-303 в проекте для того, чтобы оно было доступно в Для этого я использовал Hibernate Validator: http://www.hibernate.org/subprojects/validator.html

2

Вам нужно сделать следующее, вот как я решил в проекте mvc весеннего портлета.

  1. Добавить mvc:annotation-driven в свой applicatonContext.xml

  2. Добавьте следующий код в контроллере:

    @Autowired private LocalValidatorFactoryBean validator;

    @InitBinder public void initBinder(WebDataBinder binder) { binder.setValidator(validator); }