Я слежу за примером проекта из 4-й книги Spring в действии. Однако меня заблокировали в главе 5, где я использовал валидатор гибернации для проверки значений, отправленных с помощью формы. Вот несколько связанных кодов:
У меня есть модель по имени Спиттер:
package spittr;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Spitter {
private Long id;
@NotNull
@Size(min=5, max=16)
private String username;
@NotNull
@Size(min=5, max=25)
private String password;
@NotNull
@Size(min=2, max=30)
private String firstName;
@NotNull
@Size(min=2, max=30)
private String lastName;
private String email;
public Spitter() {
}
public Spitter(String username, String password, String firstName, String lastName, String email) {
this(null, username, password, firstName, lastName, email);
}
public Spitter(Long id, String username, String password, String firstName, String lastName, String email) {
this.id = id;
this.username = username;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = 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 getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(this, that, "firstName", "lastName", "username", "password", "email");
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this, "firstName", "lastName", "username", "password", "email");
}
}
Контроллер собирает данные формы и проверяет их:
package spittr.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import spittr.Spitter;
import spittr.data.SpitterRepository;
import javax.validation.Valid;
@Controller
@RequestMapping("/spitter")
public class SpitterController {
private SpitterRepository spitterRepository;
@Autowired
public SpitterController(SpitterRepository spitterRepository) {
this.spitterRepository = spitterRepository;
}
@RequestMapping(value = "register", method = RequestMethod.POST)
public String processRegistration(@Valid Spitter spitter, Errors errors) {
System.out.println(errors.hasErrors() + ": has errors...");
if (errors.hasErrors()){
return "registerForm";
}
spitterRepository.save(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}
}
И файлы конфигурации (на основе Java):
package spittr.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(
basePackages = {"spittr"},
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)
})
public class RootConfig {
}
SpitterWebInitializer: пакет spittr.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import spittr.web.WebConfig;
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
WebConfig пакет spittr.web;
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.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
build.gradle файл:
apply plugin: 'war'
apply plugin: 'idea'
apply plugin: 'java'
//apply from: 'gretty.plugin'
apply plugin: 'com.bmuschko.tomcat'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.bmuschko:gradle-tomcat-plugin:2.2.2'
}
}
dependencies {
compile "org.springframework:spring-webmvc:4.0.7.RELEASE"
compile "org.springframework:spring-jdbc:4.0.7.RELEASE"
compile "org.hibernate:hibernate-validator:5.3.2.Final"
//providedCompile "org.glassfish.web:javax.el:2.2.4"
// https://mvnrepository.com/artifact/javax.validation/validation-api
providedCompile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
compile "javax.servlet:jstl:1.2"
compile "org.apache.commons:commons-lang3:3.1"
def tomcatVersion = '7.0.59'
tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
"org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}",
"org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
providedCompile "javax.servlet.jsp:jsp-api:2.1"
providedCompile "javax.el:javax.el-api:2.2.4"
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven { url 'http://maven.springframework.org/release' }
maven { url 'http://maven.springframework.org/milestone' }
maven { url 'http://maven.springframework.org/snapshot' }
maven { url 'http://download.java.net/maven/2' }
mavenCentral()
}
war {
baseName = 'spittr'
version = '0.1.0'
}
tomcat {
httpPort = 8080
httpsPort = 8443
enableSSL = true
// contextPath = 'sample-app'
}
Полный проект доступен на GitHub: https://github.com/zmrenwu/Spittr
Я провожу несколько дней в Google и Stackoverflow в поисках решений, но безуспешно.
Пожалуйста, помогите мне, спасибо!




Я не знаком с Gradle, но думаю, что он сработает, если вы удалять эту строку:
providedCompile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
По крайней мере, я тестировал его с Maven, и он решил проблему.
Это решение также работало с Gradle, я только что протестировал его: я клонировал ваше репозиторий Github. Затем я заменил содержимое build.gradle тем, которое вы разместили в Stackoverflow. Затем я добавил кучу аннотаций @NotNull и @Size, и, как вы описываете в своем сообщении, проверка не сработала. Но затем я закомментировал эту строку, и проверка прошла нормально. Примечание: я запускал приложение с командой gradle tomcatRun.
Так странно, какую версию Gradle вы использовали?
Я использовал встроенную обертку gradle вашего репозитория Github - по-видимому, это gradle 4.10.
Если я закомментирую эту строку, а затем запустите gradle tomcatRun, я получил такое исключение: org.springframework.beans.factory.BeanCreationException: Ошибка создания bean с именем 'requestMappingHandlerAdapter', определенным в классе org.springframework.web.servlet.config.annotation. Делегирование WebMvcConfiguration: не удалось создать экземпляр bean-компонента; вложенное исключение - org.springframework.beans.factory.BeanDefinitionStoreExcepti on: Factory метод [public org.springframework.web.servlet.mvc.method.annotation.Reques tMappingHandlerAdapt er org.springframework.web.annotation. ...
Я пробовал разные способы воспроизвести эту новую проблему, но безуспешно. Извините. Я дам вам знать, если у меня возникнет идея ... Может быть, вы можете попробовать запустить gradlew tomcatRun, если вы еще этого не сделали.
Спасибо! Все еще не работает. Может это связано с IDEA, я использую IDEA как инструмент разработки
Я пробовал Eclipse и командную строку, и я просто пробовал IntelliJ IDEA, каждый раз она работала. Я на винде, может в этом и разница ...
Какую версию JDK вы используете? Пользуюсь JDK10, это что не совместимо? Если вы используете более младшую версию, я попробую вам версию.
Я использую JDK 8, с JDK 10 не пробовал.
Я также использую JDK 8, такая же проблема.
Добавить Я тоже пробовал на win10 , возникло другое исключение: org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем mvcUriComponentsContributor, определенным в классе org.springframework.web.servlet.config.annotation.Delegating WebMvcConfiguration: InstancConfiguration: In bean не удалось;
Я не могу проверить прямо сейчас, поэтому я не уверен, но я думаю, что у меня была эта ошибка, когда hibernate-validator был 6.0.13.Final. Решилось понижением до 5.3.2.Final.
Переход на версию 5.3.2.Final решил проблему. Очень мило с вашей стороны. Большое спасибо!
Наконец-то мы сделали это! Рад, что смог помочь!
Добавьте аннотацию @Validated к вашему классу контроллера:
@Controller
@Validated
@RequestMapping("/spitter")
public class SpitterController {
...
Спасибо за предложение, но все равно не повезло.
hibernate-validator по умолчанию использует javax.validation: validation-api: jar: 1.1.0.Final
[ИНФОРМАЦИЯ] | + - org.hibernate.validator: hibernate-validator: jar: 6.0.12.Final: компилировать [ИНФОРМАЦИЯ] | | + - (javax.validation: validation-api: jar: 1.1.0.Final:
Попробуйте перейти на последнюю версию javax.validation: validation-api: 2.0.1. Наконец, у меня это сработало.
Я обновляюсь: скомпилировал "org.hibernate: hibernate-validator: 6.0.13.Final", предоставил Группа компиляции: 'javax.validation', имя: 'validation-api', версия: '2.0.1.Final', все еще не работает .
Это может вызвать новую проблему, связанную с плагином gradle tomcat, о котором я тоже не знаю.