[英]Exception Handling in Spring MVC not reached
我以这种方式声明了一个全局异常处理程序:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(value = MissingMandatoryPropertyException.class)
public @ResponseBody ResponseEntity<String> missingMandatoryPropertyException(HttpServletRequest req, MissingMandatoryPropertyException exception) throws Exception {
return new ResponseEntity<String>("Missing mandatory parameter: " + exception.getMessage(), HttpStatus.BAD_REQUEST);
}
}
MissingMandatoryPropertyException简单扩展了RuntimeException,这是我从Spring Boot控制器抛出异常的方式:
if (userId == null){
throw new MissingMandatoryPropertyException("userId");
}
因此,我期望的是GlobalDefaultExceptionHandler拦截引发的异常,但是由于某种原因,它没有发生。
我编写了这个junit来测试异常行为:
@WebAppConfiguration
@SpringApplicationConfiguration(SpringRunner.class)
@TestPropertySource(locations="classpath:/config/local/env.config")
@SuppressWarnings("unused")
public class ExceptionControllerTest {
protected static final Logger logger = LoggerFactory.getLogger(ExceptionControllerTest.class);
protected MockMvc mockPHRMvc;
@Before
public void setup() {
this.mockPHRMvc = MockMvcBuilders.standaloneSetup(new PhrController()).build();
}
@Test public void testGetPhr_missingUserID() {
try {
MvcResult result = mockPHRMvc.perform(get("/api/1.0/phr")).andExpect(status().is(HttpStatus.BAD_REQUEST.value())).andReturn();
} catch (Exception ex) {
logger.error("Exception(): ", ex);
}
}
}
一切似乎都已正确配置,但似乎Spring Boot不知道必须使用GlobalDefaultExceptionHandler来处理异常。 相同的实现适用于tomcat下的spring mvc应用程序,但不适用于spring boot。
更新
控制器是@RestController
有什么线索吗?
要对其进行测试,您应该将ControllerAdvice
添加到mockMvc
如下所示:
@Before
public void setup() {
this.mockPHRMvc = MockMvcBuilders.standaloneSetup(new PhrController()).setControllerAdvice(new GlobalDefaultExceptionHandler()).build();
}
先前的答案是正确的。如果您不想显式定义它,则可以在@ControllerAdvice中提供基本包。
像这样
@ControllerAdvice(basePackages = {"com.XYZ.abc"})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.