spring-mvc - spring mockMVC,现在得到正确的错误消息 MethodArgumentNotValidException 抛出

标签 spring-mvc spring-validator spring-mvc-test

我的短语是检查我的 Controller ,当我使用javax.validation(JSR 380)时,它如何序列化异常

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:application-context-test.xml"})
@WebAppConfiguration
public class MyDTOControllerIT {

  private MockMvc mockMvc;


  @Mock private MyService myService;
  @Mock private MyDTOService myDTOService;

  private ObjectMapper objectMapper;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
    mockMvc =
        MockMvcBuilders.standaloneSetup(MyController)
            .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
            .setViewResolvers(
              (ViewResolver) (viewName, locale) -> new MappingJackson2JsonView())
            .build();
    objectMapper = new CustomObjectMapper();
    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
  }

  @Test
  public void create_Illegal() throws Exception {
    W req;
    try (InputStream jsonInputStream1 =
      this.getClass().getResourceAsStream(IILEGAL_REQ_BODY)) {
      req = objectMapper.readValue(jsonInputStream1, MyDto.class);
    }
    mockMvc
        .perform(
            MockMvcRequestBuilders.post(
                    "/v1/somthing")
                .content(objectMapper.writeValueAsString(req))
                .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(content().string(containsString("\"pid\":123456")))
        .andDo(MockMvcResultHandlers.print());
  }
}

dto

public class W{
  @NotNull(message = "xxxxxx") private String name;

}

类 MyDTOController ...

 @PostMapping(value = "/v1/somthing")
      @RequestBody @Validated W value){

      }

所以我希望 W 受到侵犯......

这是我的测试上下文

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

  <!-- Root Context: defines shared resources visible to all other web components -->
  <context:component-scan
    base-package="my.package">

  <context:annotation-config/>



  <mvc:annotation-driven>
    <mvc:message-converters>
      <bean id="jacksonMessageConverter"
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
    <mvc:argument-resolvers>
      <ref bean="sortResolver"/>
      <ref bean="pageableResolver"/>
    </mvc:argument-resolvers>
  </mvc:annotation-driven>

  <bean id="jsonConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="objectMapper" ref="objectMapper"/>
  </bean>

  <bean id="objectMapper" class="my.package.CustomObjectMapper"/>

  <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource"
        p:basenames="WEB-INF/i18n/messages" p:fallbackToSystemLocale="false"/>

<context:exclude-filter type="assignable"
      expression="my.package.MyDTOController"/>

我最终得到的是

Resolved Exception: Type = org.springframework.web.bind.MethodArgumentNotValidException

MockHttpServletResponse: Status = 400 Error message = null Headers = {} Content type = null Body = Forwarded URL = null Redirected URL = null

我拥有所有正确的验证器依赖项

 <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>${hibernate-validator.version}</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>${hibernate-validator.version}</version>
  </dependency>
    <hibernate-validator.version>4.1.0.Final</hibernate-validator.version>

我也有

public class ControllerExceptionHandler extends ResponseEntityExceptionHandler 

正在扫描(存在于 my.package 中)

org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler

protected ResponseEntity<Object> handleMethodArgumentNotValid(
      MethodArgumentNotValidException ex,
      HttpHeaders headers,
      HttpStatus status,
      WebRequest request)

当我在那里放置断点时,它没有被捕获,

我该怎么做才能获得正确的错误消息?

最佳答案

mockMvc =
        MockMvcBuilders.standaloneSetup(MyController)
            .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
            .setViewResolvers((ViewResolver) (viewName, locale) -> new MappingJackson2JsonView())
            .setControllerAdvice(controllerExceptionHandler)
            .build();

.setControllerAdvice(controllerExceptionHandler)

解决了。

关于spring-mvc - spring mockMVC,现在得到正确的错误消息 MethodArgumentNotValidException 抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57450895/

相关文章:

unit-testing - @WebAppConfiguration 未注入(inject)

spring-mvc - 隔离 Controller 测试无法实例化 Pageable

java - NoClassDefFoundException : javax/persistence/PersistenceContext Spring ORM with Hibernate

java - Spring MVC注释错误 "No adapter for handler - Does your handler implement a supported interface like Controller?"

java - 设置自定义字段名称和代码

java - 如何处理 Spring MVC 中的验证和严重错误

java - Spring验证非空元素的字符串列表

java - WebSphere : Cannot locate BeanDefinitionParser for element [default-servlet-handler]

java - 如何使用 RestTemplate 调用 MultipartFile Spring REST URL

spring-mvc - Spring MVC Controller 的集成测试