복붙노트

[SPRING] 스프링 4에서 주석 기반 유효성 검사를 설정하는 방법은 무엇입니까?

SPRING

스프링 4에서 주석 기반 유효성 검사를 설정하는 방법은 무엇입니까?

다음과 같이 주석 유효성 검사를 사용하고 있습니다.

    public String processRegistration(@Valid Spitter spitter, Errors errors,
            Model model) {
        if (errors.hasErrors()) {
            return "registerForm";
        }
        ...
      }

그러나 errors.hasErrors ()는 항상 false를 반환합니다. 나는 주석 구동 검증을 위해 일종의 스위치를 켜지 않았다고 생각한다. 하지만 Spring 4에서 JavaConfig로 어떻게 할 수 있습니까? @AnnotationDrivenConfig를 구성 클래스에 적용하려고 시도했지만 그 유형은 해결할 수 없습니다.

servlet-context.xml에는 이미 다음과 같은 구성이 있지만 여전히 작동하지 않습니다.

<annotation-driven />

spitter.java :

package com.learnspring.mvc.web;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.hibernate.validator.constraints.Email;

public class Spitter {

    private Long id;

    @NotNull
    @Size(min = 5, max = 16)
    private String username="default name";

    @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;

    @NotNull
    @Email
    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");
    }

}

SpitterController.java

package com.learnspring.mvc.web;

import static org.springframework.web.bind.annotation.RequestMethod.*;

import javax.validation.Valid;

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 com.learnspring.mvc.web.Spitter;
import com.learnspring.mvc.web.SpitterRepository;

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

    private SpitterRepository spitterRepository;

    @Autowired
    public SpitterController(SpitterRepository spitterRepository) {
        this.spitterRepository = spitterRepository;
    }

    @RequestMapping(value = "/register", method = GET)
    public String showRegistrationForm(Model model) {
        model.addAttribute("spitter", new Spitter());

        return "registerForm";
    }

    @RequestMapping(value = "/register", method = POST)
    public String processRegistration(@Valid Spitter spitter,
            Errors errors, Model model) {


        if (errors.hasErrors()) {
            return "registerForm";
        }

        if (spitter == null) {
            model.addAttribute("ufo", "spitter is null!");
            model.addAttribute("mark", "MARKER");
            return "forward:/spitter/spitter/registerFail";
        }

        else if (!spitter.getUsername().contains("ufo")) {
            model.addAttribute("ufo", "spitter user name is not ufo!!");
            model.addAttribute("mark", "MARKER:" + spitter.getUsername());
            model.addAttribute("pwd", "MARKER:" + spitter.getPassword());
            return "forward:/spitter/spitter/registerFail";
        }

        else
            return "redirect:/spitter/spitter/registerOK";

    }

    @RequestMapping(value = "/{username}", method = GET)
    public String showSpitterProfile(@PathVariable String username, Model model) {
        Spitter spitter = spitterRepository.findByUsername(username);
        model.addAttribute(spitter);
        return "profile";
    }

    @RequestMapping(value = "/spitter/registerOK", method = GET)
    public String showRegisterOK() {
        return "registerOK";
    }

    @RequestMapping(value = "/spitter/registerFail", method = POST)
    public String showRegisterFail() {
        return "registerFail";
    }

}

registerForm.jsp :

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="f" %>
<%@ page session="false" %>
<html>
  <head>
    <title>Spitter</title>
    <link rel="stylesheet" type="text/css" 
          href="<c:url value="/resources/style.css" />" >
  </head>
  <body>
    <h1>Register</h1>

    <f:form method="POST" commandName="spitter">
      f:First Name: <f:input path="firstName" /><br/>
      f-Last Name: <f:input path="lastName" /><br/>
      f-Email: <f:input path="email" /><br/>
      f-User Name: <f:input path="username" /><br/>
      f-Password: <f:input path="password" /><br/>
      <input type="submit" value="Register" />
    </f:form>
  </body>
</html>

WebConfig.java :

package com.learnspring.mvc.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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("com.learnspring.mvc.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();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        super.addResourceHandlers(registry);
    }

}

RootConfig.java

package com.learnspring.mvc.config;

import java.util.regex.Pattern;

import com.learnspring.mvc.config.RootConfig.WebPackage;

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.context.annotation.Import;
import org.springframework.core.type.filter.RegexPatternTypeFilter;

@Configuration
@ComponentScan(basePackages = { "com.learnspring.mvc" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = WebPackage.class) })
public class RootConfig {
    public static class WebPackage extends RegexPatternTypeFilter {
        public WebPackage() {
            super(Pattern.compile("com.learnspring.mvc\\.web"));
        }
    }
}

SpitterWebInitialization.java

package com.learnspring.mvc.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import com.learnspring.mvc.config.RootConfig;
import com.learnspring.mvc.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[] { "/" };
  }

}

그리고 web.xml : (실제로 모든 것이 주석으로 처리됩니다.)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <!--
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
      -->
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <!-- 
    <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
     -->

    <!-- Processes application requests -->
    <!--
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    -->

</web-app>

해결법

  1. ==============================

    1.설명과 다음 오류로 판단하십시오. java.lang.ClassNotFoundException : javax.validation.Validator Spring은 클래스를 보지 않으며 JSF-303 유효성 검사를 활성화하지 않습니다.

    설명과 다음 오류로 판단하십시오. java.lang.ClassNotFoundException : javax.validation.Validator Spring은 클래스를 보지 않으며 JSF-303 유효성 검사를 활성화하지 않습니다.

    올바른 jar가 클래스 경로에 있고 구현이 있는지 확인하십시오. 다음과 같은 것을 추가하는 maven을 사용할 때 트릭을해야합니다.

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.3.Final</version>
    </dependency>
    

    이렇게하면 필요한 jars가 WEB-INF / lib 디렉토리에 추가되고, Spring Web MVC가이를 감지하고 적절한 bean을 구성하게됩니다.

    다른 주석에 대한 설명을 보려면 Hibernate Validator 4.1 이상에서 @NotNull, @NotEmpty 및 @NotBlank?의 차이점을 확인하고 싶을 것입니다.

  2. ==============================

    2.내가 문제가 발생할 수 있습니다 귀하의 코드에서 두 지점을 참조하십시오.

    내가 문제가 발생할 수 있습니다 귀하의 코드에서 두 지점을 참조하십시오.

    1) 대신에 올바른 네임 스페이스 를 사용하십시오.

    2) @Controller에서 함수 매개 변수를 다음에서 변경하십시오.

       public String processRegistration(@Valid Spitter spitter, Errors errors,
            Model model) {
        if (errors.hasErrors()) {
            return "registerForm";
        }
        ...
    

    에:

    public String processRegistration(@ModelAttribute("spitter") @Valid Spitter spitter, BindingResult result) {
    
        if (result.hasErrors()) {
            return "registerForm";
        }
        ...
    

    시도 해봐! ;)

  3. from https://stackoverflow.com/questions/27886038/how-to-turn-on-annotation-driven-validation-in-spring-4 by cc-by-sa and MIT license