Не могу сделать валидацию в spring mvc. Два дня бьюсь и без безрезультатно.
Это весь мой проект
Вот мой юзер
User
package com.springfreemarkerform;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class User {
@NotNull
@NotEmpty
@Size(min = 1, max = 2)
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
А это мой мой контроллер
FormController
package com.springfreemarkerform;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;
@Controller
public class FormController {
@GetMapping("/")
public String home() {
return "redirect:/form";
}
@GetMapping("/form")
public String getForm (Model model) {
model.addAttribute("user", new User());
return "/form";
}
@PostMapping("/form")
public String postForm(@Valid User user, BindingResult result) {
if (result.hasErrors()) {
return "/error";
}
return "/good";
}
}
И вот HTML страница
form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Форма</title>
</head>
<body>
<form action="/form" method="POST" name="user">
<input type="text" name="username" >
<button type="submit">submit</button>
</form>
</body>
</html>
А это pom.xml
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>com.springfreemarkerform</groupId>
<artifactId>SpringFreemarkerForm</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<failOnMissingWebXml>false</failOnMissingWebXml>
<java.version>1.8</java.version>
<encoding>UTF-8</encoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.2.Final</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
</project>
И дальше настроечные java классы, так как я не использую xml настройки.
Это ServletInit
ServletInit
package com.springfreemarkerform;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletInitSakh extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { FreeMarkerConfigSakh.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
А это FreeMarkerConfig
FreeMarkerConfig
package com.springfreemarkerform;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
import java.util.Properties;
@Configuration
@ComponentScan("com.springfreemarkerform")
public class FreeMarkerConfigSakh {
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/WEB-INF/templates");
configurer.setDefaultEncoding("UTF-8");
configurer.setFreemarkerSettings(new Properties() {{
put("default_encoding", "UTF-8");
}});
return configurer;
}
@Bean
public ViewResolver getViewResolver(){
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setSuffix(".ftl");
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setCache(false);
return viewResolver;
}
}
Как я понимаю, если я указываю в
input не корректное значение, ну например оставляю пустым или указываю больше двух знаков и отправляю эту форму, то должно произойти то самое чудо, то есть, значение из формы, а именно поле
surname, не должно попасть в поле surname которое находится в классе
User. И
BindingResult который находится в контроллере в методе
postForm, должен сообщить что что не так. Но этот
BindingResult молчит как рыба, и из-за этого у меня ничего не работает.
То есть, кратко и просто. Если я указываю не корректное значение, то мне постоянно возвращает одну и туже страницу good а должно возвращать error если не корректные данные.