簡體   English   中英

表單驗證在 Spring Mvc 應用程序中不起作用

[英]Form validation does not work in Spring Mvc Application

我有一個使用 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);
  }
}

UserController 在 web 包中,WebConfig 在 config 包中,User 在上面這兩個包中(com.example.myapp)。

任何人都知道我做錯了什么?

我已閱讀有關此問題的所有相關問題,但無法為我的問題找到任何解決方案。

你回答了你的問題。

單元測試有效,您的表單提交並不意味着您提交表單時未設置您的數據

嘗試這個

@RequestMapping(value = "/register", method = POST)
public String processRegistration(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {

如果上述方法不起作用,請嘗試添加日志以查看該值是否已添加到用戶對象。

我最終設法弄明白了。

這不是代碼問題,而是項目配置問題。

在pom.xml中添加了一些依賴(即hibernate-validator和hibernate-validator-annotation-processor)后,IntelliJ IDEA並沒有在WEB-INF/lib的輸出目錄中自動添加相應的artifact。

我必須手動添加這些庫: https : //imgur.com/a/WRkD56F

這樣做后,驗證按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM