表单验证在Spring Mvc Application中不起作用

安德烈(Andrei Roșu-Cojocaru)

我有一个使用Spring 5.2.8.RELEASE的Spring Mvc应用程序,该应用程序部署在Tomcat 9.0.37实例中。

我的pom.xml的依赖项部分如下:

<dependencies>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.8.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.8.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
  </dependency>

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>

  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.8.RELEASE</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.1</version>
    <type>maven-plugin</type>
  </dependency>

  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
  </dependency>

  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.10.19</version>
    <scope>test</scope>
  </dependency>

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

  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
  </dependency>

  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.1.5.Final</version>
  </dependency>

  <dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
  </dependency>

  <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.0</version>
  </dependency>

</dependencies>

我的WebConfig类(在getServletConfigClasses()中返回)是:

@Configuration
@EnableWebMvc
@ComponentScan({"com.example.myapp.web", "com.example.myapp.data"})
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

我有以下包含一些验证约束的bean:

public class User {

    private Long id;

    @NotBlank
    @Size(min = 5, max = 16)
    private String firstName;

    ...
}

我有一个用于注册新用户的JSP文件:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<%@ page session="false" %>
<html>
<head>
    <title>User</title>
</head>
<body>
<h1>Register</h1>
<sf:form method="POST" modelAttribute="user">
    First Name: <sf:input path="firstName"/><br/>
    <!-- other fields -->
    <input type="submit" value="Register"/>
</sf:form>
</body>
</html>

处理请求的控制器如下:

@Controller
@RequestMapping("/user")
public class UserController {

  // ...
  @RequestMapping(value = "/register", method = POST)
  public String processRegistration(@Valid User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
      return "registerForm";
    }
    userRepository.save(user);
    return "redirect:/user/" + user.getUsername();
  }
  // ...
}

每当我在浏览器中单击“注册”按钮时,都不会触发验证。

但是,当我从单元测试调用该方法时,验证将按预期执行(以下测试失败,因为未执行重定向):

public class UserControllerTest {

  @Test
  public void shouldProcessRegistration() throws Exception {
    UserRepository mockRepository = mock(UserRepository.class);
    User unsaved = new User("John", "Doe", "jdoe", "pass");
    User saved = new User(1L, "John", "Doe", "jdoe", "pass");
    when(mockRepository.save(unsaved)).thenReturn(saved);

    UserController controller = new UserController(mockRepository);
    MockMvc mockMvc = standaloneSetup(controller).build();

    mockMvc.perform(post("/user/register")
      .param("firstName", "John")
      .param("lastName", "Doe")
      .param("username", "jdoe")
      .param("password", "pass"))
      .andExpect(redirectedUrl("/user/jdoe"));

    verify(mockRepository, atLeastOnce()).save(unsaved);
  }
}

用户控制器位于Web程序包中,WebConfig位于配置程序包中,而用户位于这两个程序包(com.example.myapp)上方。

有人知道我在做什么错吗?

我已经阅读了有关此问题的所有相关问题,但找不到针对我问题的任何解决方案。

安德烈(Andrei Roșu-Cojocaru)

我最终设法弄清楚了。

这不是代码问题,而是项目配置问题。

在pom.xml中添加了一些依赖项(即hibernate-validator和hibernate-validator-annotation-processor)之后,IntelliJ IDEA并未将相应的工件自动添加到WEB-INF / lib的输出目录中。

我必须手动添加这些库:https : //imgur.com/a/WRkD56F

这样做之后,验证将按预期进行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring MVC表单验证不起作用

来自分类Dev

Spring MVC,表单提交不起作用

来自分类Dev

Spring MVC,表单提交不起作用

来自分类Dev

Spring MVC验证不起作用

来自分类Dev

@Range在Spring MVC中不起作用

来自分类Dev

注销在 spring mvc 中不起作用

来自分类Dev

验证不起作用的MVC

来自分类Dev

注释验证在ASP .NET MVC中不起作用

来自分类Dev

电子邮件验证在MVC中不起作用

来自分类Dev

@Size和@Pattern注释在Spring MVC中不起作用

来自分类Dev

按名称自动接线在Spring MVC中不起作用

来自分类Dev

POST 方法在 Spring MVC 中不起作用

来自分类Dev

MVC验证RequiredIfTrue不起作用

来自分类Dev

Spring MVC请求映射不起作用

来自分类Dev

SwaggerSpringMvcPlugin在Spring MVC上不起作用

来自分类Dev

OpenEntityManagerInViewFilter不起作用-Spring MVC

来自分类Dev

Spring MVC资源不起作用

来自分类Dev

Spring MVC 4 ResourceHandlers不起作用

来自分类Dev

Spring MVC @Pathvariable 不起作用

来自分类Dev

验证Javascript中的表单不起作用

来自分类Dev

表单验证在 angular 中不起作用?

来自分类Dev

MVC5表单身份验证不起作用

来自分类Dev

Ninject在ASP.NET MVC中的自定义验证属性中不起作用

来自分类Dev

Ninject在ASP.NET MVC中的自定义验证属性中不起作用

来自分类Dev

使用@Valid的Spring验证表单不起作用

来自分类Dev

将表单发布到ASP.NET Core MVC中的控制器不起作用

来自分类Dev

表单验证不起作用

来自分类Dev

窗口身份验证在MVC4中不起作用

来自分类Dev

ASP.NET MVC中的必需和范围验证不起作用