Валидатор гибернации не работает с приложением Spring MVC

Я слежу за примером проекта из 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 в поисках решений, но безуспешно.

Пожалуйста, помогите мне, спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
450
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не знаком с Gradle, но думаю, что он сработает, если вы удалять эту строку:

providedCompile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final' 

По крайней мере, я тестировал его с Maven, и он решил проблему.

Это может вызвать новую проблему, связанную с плагином gradle tomcat, о котором я тоже не знаю.

You Gakukou 12.10.2018 16:09

Это решение также работало с Gradle, я только что протестировал его: я клонировал ваше репозиторий Github. Затем я заменил содержимое build.gradle тем, которое вы разместили в Stackoverflow. Затем я добавил кучу аннотаций @NotNull и @Size, и, как вы описываете в своем сообщении, проверка не сработала. Но затем я закомментировал эту строку, и проверка прошла нормально. Примечание: я запускал приложение с командой gradle tomcatRun.

Romain Warnan 12.10.2018 22:51

Так странно, какую версию Gradle вы использовали?

You Gakukou 13.10.2018 13:27

Я использовал встроенную обертку gradle вашего репозитория Github - по-видимому, это gradle 4.10.

Romain Warnan 13.10.2018 17:51

Если я закомментирую эту строку, а затем запустите 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. ...

You Gakukou 14.10.2018 02:57

Я пробовал разные способы воспроизвести эту новую проблему, но безуспешно. Извините. Я дам вам знать, если у меня возникнет идея ... Может быть, вы можете попробовать запустить gradlew tomcatRun, если вы еще этого не сделали.

Romain Warnan 14.10.2018 11:13

Спасибо! Все еще не работает. Может это связано с IDEA, я использую IDEA как инструмент разработки

You Gakukou 14.10.2018 15:04

Я пробовал Eclipse и командную строку, и я просто пробовал IntelliJ IDEA, каждый раз она работала. Я на винде, может в этом и разница ...

Romain Warnan 14.10.2018 17:42

Какую версию JDK вы используете? Пользуюсь JDK10, это что не совместимо? Если вы используете более младшую версию, я попробую вам версию.

You Gakukou 15.10.2018 02:59

Я использую JDK 8, с JDK 10 не пробовал.

Romain Warnan 15.10.2018 08:12

Я также использую JDK 8, такая же проблема.

You Gakukou 15.10.2018 09:28

Добавить Я тоже пробовал на win10 , возникло другое исключение: org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем mvcUriComponentsContributor, определенным в классе org.springframework.web.servlet.config.annotation.Delegating‌ WebMvcConfiguration: InstancConfiguration: In bean не удалось;

You Gakukou 15.10.2018 10:04

Я не могу проверить прямо сейчас, поэтому я не уверен, но я думаю, что у меня была эта ошибка, когда hibernate-validator был 6.0.13.Final. Решилось понижением до 5.3.2.Final.

Romain Warnan 15.10.2018 10:55

Переход на версию 5.3.2.Final решил проблему. Очень мило с вашей стороны. Большое спасибо!

You Gakukou 16.10.2018 02:47

Наконец-то мы сделали это! Рад, что смог помочь!

Romain Warnan 16.10.2018 06:30

Добавьте аннотацию @Validated к вашему классу контроллера:

@Controller
@Validated
@RequestMapping("/spitter")
public class SpitterController {

...

Спасибо за предложение, но все равно не повезло.

You Gakukou 12.10.2018 16:10

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', все еще не работает .

You Gakukou 12.10.2018 18:10

Другие вопросы по теме