长话短说。我的服务,抛出EntityNotFound异常。默认情况下,Spring引导程序不知道King异常是什么以及如何处理它,只是显示“500 Internal Server Error”。
我别无选择,只能实现自己的异常处理机制。
使用Spring启动可以通过多种方法解决此问题。我选择将@ControllerAdvice与@ExceptionHandler方法一起使用。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<ErrorDetails> handleNotFound(EntityNotFoundException exception, HttpServletRequest webRequest) {
ErrorDetails errorDetails = new ErrorDetails(
new Date(),
HttpStatus.NOT_FOUND,
exception,
webRequest.getServletPath());
return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}
}
因此,当抛出异常时,新处理程序捕获异常并返回包含消息的好json,如:
{
"timestamp": "2018-06-10T08:10:32.388+0000",
"status": 404,
"error": "Not Found",
"exception": "EntityNotFoundException",
"message": "Unknown employee name: test_name",
"path": "/assignments"
}
实施 - 不是那么难。最难的部分是测试。
首先,测试spring时似乎并不知道测试模式下的新处理程序。 我如何告诉spring知道处理此类错误的新实现?
@Test
public void shouldShow404() throws Exception {
mockMvc.perform(post("/assignments")
.contentType(APPLICATION_JSON_UTF8_VALUE)
.content(new ClassPathResource("rest/assign-desk.json").getInputStream().readAllBytes()))
.andExpect(status().isNotFound());
}
正如我所看到的,这个测试应该通过,但事实并非如此。
欢迎任何想法。谢谢!
答案 0 :(得分:0)
question或github issue可能重复。不知道如何设置测试类。但是,如果您的测试类具有WebMvcTest,则应注册所有控制器和控制器建议。
答案 1 :(得分:0)
找到答案。
可能涉及的人:
设置apon类:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GlobalExceptionHandlerTest{
//
}
和测试:
@Test
public void catchesExceptionWhenEntityNotFoundWithSpecificResponse() throws Exception {
mockMvc.perform(post("/assignments")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(new ClassPathResource("rest/assign-desk.json").getInputStream().readAllBytes()))
.andExpect(status().isNotFound())
.andExpect(jsonPath("status").value(404))
.andExpect(jsonPath("exception").value("EntityNotFoundException"))
.andExpect(jsonPath("message").value("Unknown employee name: abc"));
}
谢谢大家。