我有两个用于两个不同版本API的不同控制器。我也试图区分异常处理。关于此需求,我创建了自定义注释来区分控制器。这是我的代码片段:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiV1 { }
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiV2 { }
@ApiV1
@RequestMapping("/path")
@RestController
public class XYZControllerImpl implements com.xyz.XYZController { ... }
@ApiV2
@RequestMapping("/v2/path")
@RestController
public class XYZControllerV2Impl implements com.xyz.v2.XYZController { ... }
@RestControllerAdvice(annotations = ApiV1.class)
public class ExceptionHandlerForV1 { ... }
@RestControllerAdvice(annotations = ApiV2.class)
public class ExceptionHandlerForV2 { ... }
问题出在这里,当我运行版本1实现的测试时。 ExceptionHandlerForV1
不会捕获异常。该问题还提到了here,该解决方案对我而言不起作用,但似乎我具有所有必需的实现。
如果有人帮助我解决此问题,我将不胜感激。
注意:我们使用的是春季版本5.1.3.RELEASE
。另外,ExceptionHandlerForV1
在没有注释声明的情况下工作。
这是示例失败的测试用例:
@Test
public void testPostWithValidCredentialsWorks() throws Exception {
mockServerWith200Response();
// just POSTing without payload for simplicity
mockMvc.perform(post(API_PATH)
.with(createSampleCredentials()))
.andExpect(status().isBadRequest());
}
这是结果:
java.lang.AssertionError: Status expected:<400> but was:<415>
Expected :400
Actual :415