【问题标题】:How to handle @Valid MethodArgumentNotValidException by @RestControllerAdvice如何通过@RestControllerAdvice 处理@Valid MethodArgumentNotValidException
【发布时间】:2018-12-15 19:59:29
【问题描述】:

直升机,
我在测试抛出 MethodArgumentNotValidException 的控制器时遇到问题。

我有带有验证注释的实体。

public class Tag extends ResourceSupport {
...
    @NotEmpty(message = "Tag name cannot be empty.")
    @NotNull(message = "Tag name cannot be empty.")
    private String name;
}

带有@RequestBody 的@Valid 注解的控制器

@RestController
@RequestMapping(value="/api/tags")
public class TagController {
    .......

    @PostMapping(value = "")
    public ResponseEntity<Tag> addNewTag(@Valid @RequestBody Tag tag) {
        Tag createdTag = tagService.saveOrUpdate(tag);
        return new ResponseEntity<>(createdTag, HttpStatus.CREATED);
    }

}

现在我想用单元测试来测试这个控制器

@RunWith(MockitoJUnitRunner.class)
public class TagControllerTest {
     private MockMvc mockMvc;

     @Before
     public void setup() {
            JacksonTester.initFields(this, new ObjectMapper());
            mockMvc = MockMvcBuilders.standaloneSetup(tagController).setControllerAdvice(new GlobalExceptionHandlerController()).build();
        }

    @Test
    public void shouldntAllowToSetTagNameEmpty() throws Exception {
        Tag tag1 = new Tag();

        mockMvc.perform(post("/api/tags").contentType(MediaType.APPLICATION_JSON)
            .content(jsonTags.write(tag1).getJson()))
            .andExpect(status().isBadRequest());

   }

全局异常处理类就是这样创建的。它只是作为互联网的示例。

@RestControllerAdvice
public class GlobalExceptionHandlerController extends ResponseEntityExceptionHandler {

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

    String bodyOfResponse = ex.getMessage();
    return new ResponseEntity(bodyOfResponse, headers, HttpStatus.BAD_REQUEST);
}

测试正在通过,因为它只测试状态,但在控制台中我有堆栈跟踪和错误日志

org.springframework.web.bind.MethodArgumentNotValidException:方法中索引 0 处的参数验证失败:..... 默认消息 [标签名称不能为空。]]

错误堆栈跟踪出现在控制台日志中是否正确?

【问题讨论】:

    标签: java spring rest


    【解决方案1】:

    您的实现工作正常, 这是正常行为,在测试期间,MockMvc 使用

    打印 MvcResult 详细信息

    打印结果处理程序

    因此它还将打印通过调用 printResolvedException()

    的 HandlerExceptionResolver 解决的异常

    查看PrintingResultHandler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 2018-06-16
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多