Pregunta

I have annotated my fields in my model and am using the @Valid annotation on my post controller but it appears to be performing no validation (result.errors is empty)

Any ideas what might be causing this?

Java based configuration:

@FeatureConfiguration
public class MvcFeatures {

    @Feature
    public MvcAnnotationDriven annotationDriven() {
        return new MvcAnnotationDriven();
    }

    @Feature
    public MvcResources css() {
        return new MvcResources("/css/**", "/css/");
    }

    @Feature
    public MvcResources js() {
        return new MvcResources("/js/**", "/js/");
    }

    @Feature
    public MvcViewControllers viewController() {
        return new MvcViewControllers("/", "home");
    }

    @Feature
    public ComponentScanSpec componentScan() {
        return new ComponentScanSpec("com.webapp")
                .excludeFilters(new AnnotationTypeFilter(Configuration.class),
                        new AnnotationTypeFilter(FeatureConfiguration.class));
    }

}



Controller:

@Controller
public class UserController extends AppController
{
    static Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private IUserService userService;

    @RequestMapping(value = "/registration", method = RequestMethod.GET)
    public ModelAndView get()
    {

        ModelAndView modelAndView = new ModelAndView(Consts.MODEL_RESISTER_PAGE);
        modelAndView.addObject("user", new User());

        return modelAndView;
    }

    @RequestMapping(value = "/registration", method = RequestMethod.POST)
    public ModelAndView post(@Valid User user, BindingResult result)
    {

        if (result.hasErrors())
        {
            ModelAndView modelAndView = new ModelAndView(
                    Consts.MODEL_RESISTER_PAGE);
            modelAndView.addObject("user", result.getModel());
            return modelAndView;
        }
        else
        {
            // SAVE HERE
            ModelAndView modelAndView = new ModelAndView(
                    Consts.MODEL_RESISTER_PAGE);
            return modelAndView;
        }
    }
}



Model:

@Entity
public class User implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = -5232533507244034448L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotEmpty
    @Size(min=2, max=15)
    private String firstname;

    @NotEmpty
    @Size(min=2, max=15)
    private String surname;

    @NotEmpty
    @Email
    private String email;

    @NotEmpty
    @Size(min=6, max=10)
    private String password;

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public String getFirstname()
    {
        return firstname;
    }

    public void setFirstname(String firstname)
    {
        this.firstname = firstname;
    }

    public String getSurname()
    {
        return surname;
    }

    public void setSurname(String surname)
    {
        this.surname = surname;
    }

    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }
}



add.html (Using thymeleaf view resolver)

<form id="registrationForm" action="#"
        th:action="@{/registration}" th:object="${user}" method="post"
        class="clearfix">

         <legend>Registration</legend>

        <div class="input">
          <input type="text" th:field="*{firstname}"
            placeholder="Firstname" th:class="${#fields.hasErrors('firstname')}? 'fieldError'"
             />
        </div>

        <div class="input">
          <input type="text" th:field="*{surname}" placeholder="Surname" />
        </div>

        <div class="input">
          <input type="text" th:field="*{email}" placeholder="Email" />
        </div>

        <div class="input">
          <input type="password" th:field="*{password}"
            placeholder="Password" />
        </div>

        <div class="clearfix">
          <input type="submit" class="btn btn-success btn-large" value="Register" />
        </div>

      </form>



Pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ConsumerApplicaton</groupId>
    <artifactId>ConsumerApplicaton</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>springsource-milestone</id>
            <name>Spring Framework Milestone Repository</name>
            <url>http://maven.springframework.org/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- thymeleaf -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>${thymeleaf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring3</artifactId>
            <version>${thymeleaf.version}</version>
        </dependency>

        <!-- persistence -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.6.9.Final</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
        </dependency>

        <!-- json, xml, atom -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>${jackson-mapper-asl.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
            <scope>runtime</scope>
        </dependency>

        <!-- DB -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
            <scope>runtime</scope>
        </dependency>

        <!-- logging -->

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.1</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>

        <!-- Various -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>${cglib.version}</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>ConsumerApplicaton</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <!-- VERSIONS -->
        <!-- <spring.version>3.1.0.RELEASE</spring.version> -->
        <spring.version>3.1.0.M1</spring.version>
        <cglib.version>2.2.2</cglib.version>

        <thymeleaf.version>2.0.11</thymeleaf.version>

        <jackson-mapper-asl.version>1.9.5</jackson-mapper-asl.version>
        <jaxb-api.version>2.2.6</jaxb-api.version>

        <!-- VERSIONS - persistence -->
        <mysql-connector-java.version>5.1.18</mysql-connector-java.version> <!-- latest version on: 02.10.2011 - http://dev.mysql.com/downloads/connector/j/ -->
        <hibernate.version>4.1.0.Final</hibernate.version>

        <!-- VERSIONS - logging -->
        <org.slf4j.version>1.6.4</org.slf4j.version>
    </properties>

</project>
¿Fue útil?

Solución

@Feature is no longer supported. This was implemented in Spring 3.1.0.M1 and then removed in favour of @Enable style annotations in 3.1.0.M2.

The best approach here is to move to 3.1.1.RELEASE and use @Configuration and friends.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top