java - Spring 4 MVC 验证不工作 - BindingResult hasErrors 是 false

标签 java spring spring-mvc spring-validator

我正在对 Spring Controller 的 post 方法进行单元测试(使用 org.springframework.test.web.servlet.MockMvc),当表单中存在验证错误时,我试图确认这一点它会通过检查 BindingResult.hasErrors 方法将 View 发送回表单。

这是我的测试

  @Test
  public void testFilterChannelProgrammesWhenChannelListAndGenreListAreEmptyAndProgNameIsTooLong() throws Exception {
    String progName = TestUtil.createStringWithLength(301);

    mockMvc.perform(post("/api/filter")
        .contentType(MediaType.APPLICATION_FORM_URLENCODED)
        .param("progName", progName)
        .sessionAttr("filter", new ProgrammeSearchDTO())
        )
        .andExpect(status().isOk())
        .andExpect(view().name("api/filter"))
        .andExpect(forwardedUrl("/WEB-INF/jsp/api/filter.jsp"))
        .andExpect(model().attributeHasFieldErrors("filter", "progName"))
        .andExpect(model().attributeHasFieldErrors("filter", "genreIdList"))
        .andExpect(model().attributeHasFieldErrors("filter", "channelIdList"))        
        .andExpect(model().attribute("filter", hasProperty("progName", is(progName))));

    verifyZeroInteractions(channelProgrammeServiceMock);
  }

这里是session属性绑定(bind)的DTO

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

public class ProgrammeSearchDTO {

  @NotEmpty
  private String[] channelIdList;

  @NotEmpty
  private String[] genreIdList;

  private String fromDateTime;
  private String toDateTime;

  @Length(max = 200)
  private String progName;

  private boolean subtitled;
  private boolean signed;
  private boolean film;

  public String[] getChannelIdList() {
    return channelIdList;
  }

  public String getFromDateTime() {
    return fromDateTime;
  }

  public String[] getGenreIdList() {
    return genreIdList;
  }  

  public String getProgName() {
    return progName;
  }

  public String getToDateTime() {
    return toDateTime;
  }

  public boolean isFilm() {
    return film;
  }

  public boolean isSigned() {
    return signed;
  }

  public boolean isSubtitled() {
    return subtitled;
  }

  public void setChannelIdList(String[] channelIdList) {
    this.channelIdList = channelIdList;
  }

  public void setFilm(boolean film) {
    this.film = film;
  }

  public void setFromDateTime(String fromDateTime) {
    this.fromDateTime = fromDateTime;
  }

  public void setGenreIdList(String[] genreIdList) {
    this.genreIdList = genreIdList;
  }

  public void setProgName(String progName) {
    this.progName = progName;
  }

  public void setSigned(boolean signed) {
    this.signed = signed;
  }

  public void setSubtitled(boolean subtitled) {
    this.subtitled = subtitled;
  }

  public void setToDateTime(String toDateTime) {
    this.toDateTime = toDateTime;
  }  


}

和 Controller 方法

  @RequestMapping(value = "/api/filter", method = RequestMethod.POST)
  public String filterChannelProgrammes(@Valid @ModelAttribute ProgrammeSearchDTO programmeSearchDTO, BindingResult result, Model model) {
    if(result.hasErrors()) {
      return "api/filter";
    }
    model.addAttribute("results", null);
    return "redirect:filterResults";
  }

对于此测试,应该执行 return "api/filter";,但 hasErrors() 始终为 false。我也尝试过以下

  @RequestMapping(value = "/api/filter", method = RequestMethod.POST)
  public String filterChannelProgrammes(@Valid @ModelAttribute("filter") ProgrammeSearchDTO programmeSearchDTO, BindingResult result, Model model) {
    if(result.hasErrors()) {
      return "api/filter";
    }
    model.addAttribute("results", null);
    return "redirect:filterResults";
  }

但是 hasErrors() 仍然是 false

编辑

经过更多挖掘后,我对此进行了排序,它还需要上下文配置 xml 中的以下内容

<mvc:annotation-driven />

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

以及maven pom.xml中的这些依赖

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.2.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>2.2.4</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.el</artifactId>
        <version>2.2.4</version>
    </dependency>

最佳答案

经过更多挖掘后,我对此进行了排序,它还需要上下文配置 xml 中的以下内容

<mvc:annotation-driven />

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

以及maven pom.xml中的这些依赖

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.2.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>2.2.4</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.el</artifactId>
        <version>2.2.4</version>
    </dependency>

关于java - Spring 4 MVC 验证不工作 - BindingResult hasErrors 是 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26993364/

相关文章:

java - 测试时如何在 JOptionPane 上自动单击“确定”?

java - 我的智囊游戏中的 For 循环

扩展类中的Java反射字段值

java - 添加 mvc 命名空间时 Spring-MVC 不起作用

java - 如何在没有任何注释的 Spring 项目中使用 Jackson Json 解析?

Spring 注释 Controller 无法与 Heroku 上的 Tomcated Embedded 一起使用

java - 将通用对象传递给方法中的列表 - JAVA

java - 如何在 Spring Boot 中禁用或覆盖 RequestCacheAwareFilter

java - LocalContainerEntityManagerFactoryBean.setPersistenceUnitRootLocation 已在 Spring-Boot 1.4.1 中删除

java - 测试 Thymeleaf 表单/Spring MVC Controller 交互的最佳方法