3

I'm trying to use the @Validated annotation to valid form data returned to a controller, but it fails to call the custom validator that I have created. Code below:

@PostMapping("/saveTransaction")
    public String saveTransaction(@ModelAttribute("transaction") 
@Validated Transactions transaction, BindingResult bindingResult) {

    if(bindingResult.hasErrors()) {
        System.out.println("Non formated form stuff.");
        return "transactions/transactionsForm";
    }

The code works if I manual call the Validator as in:

@PostMapping("/saveTransaction")
    public String saveTransaction(@ModelAttribute("transaction") Transactions transaction, BindingResult bindingResult) {
        validator.validate(transaction, bindingResult);
        if(bindingResult.hasErrors()) {
            System.out.println("Non formated form stuff.");
            return "transactions/transactionsForm";
        }

I am auto wiring my class and initializing the validator using the following code.

    @Autowired
    private TransactionService transactionService;

    @Autowired
    @Qualifier("transactionValidator")
    private Validator validator;

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

I have the following code in Spring.xml file:

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

    <bean id="transactionValidator" class="org.lexusmanson.lexbudget.validator.TransactionValidator" />

My current dependencies are:

   <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.9</java.version>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <spring.version>5.0.1.RELEASE</spring.version>
        <hibernate.version>5.2.11.Final</hibernate.version>
        <hibernate.validator>5.4.1.Final</hibernate.validator>
        <c3p0.version>0.9.5.2</c3p0.version>
        <jstl.version>1.2.1</jstl.version>
        <tld.version>1.1.2</tld.version>
        <servlets.version>3.1.0</servlets.version>
        <jsp.version>2.3.1</jsp.version>
        <hsqldb.version>1.8.0.10</hsqldb.version>
        <aspectj.version>1.8.13</aspectj.version>
  </properties>

  <dependencies>
        <!-- Spring MVC Dependency -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- Spring ORM -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- Hibernate Core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        <!-- Hibernate-C3P0 Integration -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        <!-- c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>${c3p0.version}</version>
        </dependency>

        <!-- Hibernate Validator -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate.validator}</version>
        </dependency>

        <!-- JSTL Dependency -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>javax.servlet.jsp.jstl-api</artifactId>
            <version>${jstl.version}</version>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>${tld.version}</version>
        </dependency>

        <!-- Servlet Dependency -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlets.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- JSP Dependency -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>${jsp.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- HSQL Dependency -->
        <dependency>
            <groupId>hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>${hsqldb.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-extras</artifactId>
            <version>3.0.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
  </dependencies>

Why won't the annotation call my validation code?

1
  • I've tried to add validation to another class and it seems to work fine there. Still can't get it to work on the above example. Totally don't know what's wrong.
    – Lex Man
    Commented Nov 23, 2017 at 17:08

3 Answers 3

2

Can you try with @valid annotation instead of @validated hope it will help.

3
  • 1
    Can you by placing valid annotation before model attribute Commented Nov 23, 2017 at 16:12
  • Yeah I tired that one as well.
    – Lex Man
    Commented Nov 23, 2017 at 16:19
  • Doesn't work for partial validation.
    – skubski
    Commented Oct 5, 2022 at 8:08
1

Change the code as mentioned below: Binding result should come after @Valid annotation

@PostMapping("/saveTransaction")
    public String saveTransaction(@Valid Transactions transaction, BindingResult bindingResult) {
        validator.validate(transaction, bindingResult);
        if(bindingResult.hasErrors()) {
            System.out.println("Non formated form stuff.");
            return "transactions/transactionsForm";
        }
2
  • This answer works but I've gotten the style I used in the question to work elsewhere in my application, so I'm not sure whats going wrong.
    – Lex Man
    Commented Nov 24, 2017 at 10:43
  • Doesn't work for partial validation.
    – skubski
    Commented Oct 5, 2022 at 8:08
0

1: Add below dependency if not already added

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

2: Use @Valid Annotation instead of @Validated annotation

3: User some validation constraints in bean Transactions like @NotEmpty,@NotNull etc

Hope it should work for you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.