Search code examples
javaspringvalidationspring-mvcbean-validation

Spring boot application form is not validating on the given validations


@Entity
public class People {
    @NotNull
    @Size(min = 2, max = 20)
    private String name;

    @NotNull(message = "Please enter Phone Number")
    private long phoneNumber;

//getters and setters
}

For the above model class, my jsp page is not showing any default error message or the one provided to it. The form is getting submitted somehow. I've added @valid annotation in the post route.

Also, i've added this dependencies

    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

Post Route

@Valid
    @PostMapping("/emergency-complaint")
    public String emergencyComplaintIndexPost(@Valid People people, BindingResult result) {
        if (result.hasErrors()) {
            return "emergency-complaint/index";
        }
        return "home";
    }

Form Jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>CRS | Kolkata</title>
    </head>
    <body>
        <form:errors path="people.*" cssStyle="color: #ff0000;" />
        <div>
            <h1>Lodge an Emergency Complaint Now!!</h1>
            <form:form
                action="/emergency-complaint"
                method="post"
                modelAttribute="people"
            >
                <form:label path="emergencyComplaint.complaint" for="complaint">
                    Emergency Complaint
                </form:label>
                <form:input
                    type="text"
                    name="complaint"
                    id="complaint"
                    path="emergencyComplaint.complaint"
                />

                <form:label path="name" for="name">Name</form:label>
                <form:input path="name" type="text" name="name" id="name" />

                <form:label path="phoneNumber" for="phoneNumber"
                    >Phone Number</form:label
                >
                <form:input
                    path="phoneNumber"
                    type="Number"
                    name="phoneNumber"
                    id="phoneNumber"
                />

                <button type="submit">Lodge</button>
            </form:form>
        </div>
    </body>
</html>

POM.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/>
  </parent>
  <groupId>com.naha</groupId>
  <artifactId>crime-reporting-system</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>Demo project for Spring Boot</description>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <!-- <dependency>
      <groupId>org.apache.derby</groupId>
      <artifactId>derby</artifactId>
      <scope>runtime</scope>
    </dependency> -->
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.webjars/bootstrap -->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>4.5.0</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

Solution

  • The validation-api is the Bean Validation specification API, it is not an implementation. You need to have an implementation (for example, Hibernate Validator) in your classpath.

    See this answer.

    Also there is need to put @Valid on your handler method here.