2010-11-26 33 views
7

J'ai créé une classe de haricots et je l'utilise dans mon contrôleur, mais cela ne semble pas fonctionner. À savoir même si j'entre un âge invalide, result.hasErrors est toujours faux.Spring portlet mvc: @Valid ne semble pas fonctionner

classe 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; 
    } 
} 

Controller Snippet:

@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> 

modifier: Mon userRegistration-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> 

C'est la ligne mvc: spring-validation qui me donne l'erreur: cvc-complex-type.2.4.c the matching wildcard is strict, but no declaration can be found for the element mvc:annotation-driven..

Répondre

4

Vous avez besoin de <mvc:annotation-driven /> pour activer la validation jsr-303. Si vous ne voulez pas l'utiliser pour une raison quelconque, ou si, à un moment donné, il commence à créer des problèmes (comme il l'a fait pour moi), jetez un oeil à this question

Mise à jour: en schemaLocation l'entrée mvc doit contenir ces deux:

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

Merci pour la pointe, je essayé de le placer dans mon utilisateur Registration-portlet.xml mais j'obtiens un: le préfixe mvc pour mvc: annotation-driven n'est pas défini. Mais quand je google je ne vois aucune différence? – jack

+0

Modifier: ajouté: xmlns: mvc = "http://www.springframework.org/schema/mvc" et j'ai également ajouté: http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd à ma schémalocation. Et maintenant je reçois l'erreur: le caractère générique correspondant est strict, mais aucune déclaration ne peut être trouvée pour l'élément mvc: annotation-driven. Désolé pour le double post mais mon internet est vraiment lent. Donc, je pourrais aussi manquer certaines réponses. – jack

+0

Je pense que je pourrais manquer une dépendance maven, mais je ne peux pas vraiment y penser. – jack

0

Je pense que la raison est que ServletRequestDataBinder (étend DataBinder) n'a pas exemple org.springframework.validation.Validator, il ne vérifie rien (pour valider le haricot @Valid annotée vous devez avoir javax.validation.Validator exemple) .

org.springframework.validation.DataBinder

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

Vous pouvez définir l'instance Validator dans @InitBinder méthodes annotées: -

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

Yo peut également définir l'instance de validateur 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); 
    } 
} 

Pour créer une instance de LocalValidatorFactoryBean soit utiliser mvc:annotation-driven OU set up LocalValidatorFactoryBean as bean.

+0

C'est un peu plus verbeux que le mvc: route d'annotation-drive mais merci pour votre contribution. – jack

8

J'avais exactement le même problème. J'ai lu https://jira.springframework.org/browse/SPR-6817 et travaillé le problème autour en ajoutant à ma config:

<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> 

Vous devez également avoir un validateur JSR-303 dans votre projet afin qu'il soit disponible Pour cela je Hibernate Validator: http://www.hibernate.org/subprojects/validator.html

+0

Je souhaite avoir trouvé cet article plus tôt. 99% de tous les exemples manquants manquent ce peu d'information critique. – Tommy

+0

pour une raison inconnue, cette solution n'a pas fonctionné pour moi, mais @ Andy a fait! – xeon

2

Vous devez faire ce qui suit, c'est ainsi que j'ai résolu dans le projet ressort portlet mvc.

  1. Ajouter mvc:annotation-driven à votre applicatonContext.xml

  2. Ajoutez le code suivant dans votre contrôleur:

    @Autowired private LocalValidatorFactoryBean validator;

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