У меня есть два разных контроллера для двух разных версий 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
.Проблема также упоминается здесь , решение не работает для меня, но, похоже, у меня есть все необходимые реализации.
Если кто-нибудь поможет мне решить эту проблему, я буду признателен.
Примечание: мы используем весеннюю версию 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