gpt4 book ai didi

spring - Spring MVC 测试中的空异常主体

转载 作者:行者123 更新时间:2023-12-04 03:37:18 25 4
gpt4 key购买 nike

我在尝试让 MockMvc 在响应正文中包含异常消息时遇到问题。我有一个 Controller 如下:

@RequestMapping("/user/new")
public AbstractResponse create(@Valid NewUserParameters params, BindingResult bindingResult) {
if (bindingResult.hasErrors()) throw BadRequestException.of(bindingResult);
// ...
}

哪里 BadRequestException看起来像这样:
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "bad request")
public class BadRequestException extends IllegalArgumentException {

public BadRequestException(String cause) { super(cause); }

public static BadRequestException of(BindingResult bindingResult) { /* ... */ }

}

我对 /user/new 运行以下测试 Controller :
@Test
public void testUserNew() throws Exception {
getMockMvc().perform(post("/user/new")
.param("username", username)
.param("password", password))
.andDo(print())
.andExpect(status().isOk());
}

打印以下输出:
  Resolved Exception:
Type = controller.exception.BadRequestException

ModelAndView:
View name = null
View = null
Model = null

FlashMap:

MockHttpServletResponse:
Status = 400
Error message = bad request
Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Frame-Options=[DENY]}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []

有没有人知道为什么是 Bodyprint() 中丢失输出?

编辑:我没有使用任何自定义异常处理程序,并且当我运行服务器时代码按预期工作。也就是说,运行应用程序并向服务器发出相同的请求返回
{"timestamp":1423076185822,
"status":400,
"error":"Bad Request",
"exception":"controller.exception.BadRequestException",
"message":"binding failed for field(s): password, username, username",
"path":"/user/new"}

正如预期的那样。因此, MockMvc 存在问题。我想。它以某种方式错过了捕获 message异常的字段,而常规应用程序服务器的默认异常处理程序按预期工作。

最佳答案

开通后ticket对于这个问题,我被告知正文中的错误消息由 Spring Boot 处理,它在 Servlet 容器级别配置错误映射,并且由于 Spring MVC 测试使用模拟 Servlet 请求/响应运行,因此没有这样的错误映射.此外,他们建议我至少创建一个 @WebIntegrationTest并坚持使用 Spring MVC Test 作为我的 Controller 逻辑。

最终,我决定使用我自己的自定义异常处理程序并坚持使用 MockMvc其余的和以前一样。

@ControllerAdvice
public class CustomExceptionHandler {

@ExceptionHandler(Throwable.class)
public @ResponseBody
ExceptionResponse handle(HttpServletResponse response, Throwable throwable) {
HttpStatus status = Optional
.ofNullable(AnnotationUtils.getAnnotation(throwable.getClass(), ResponseStatus.class))
.map(ResponseStatus::value)
.orElse(HttpStatus.INTERNAL_SERVER_ERROR);
response.setStatus(status.value());
return new ExceptionResponse(throwable.getMessage());
}

}

@Data
public class ExceptionResponse extends AbstractResponse {

private final long timestamp = System.currentTimeMillis();

private final String message;

@JsonCreator
public ExceptionResponse(String message) {
checkNotNull(message, "message == NULL");
this.message = message;
}

}

关于spring - Spring MVC 测试中的空异常主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28324994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com