Джерси ExceptionMapper, положитесь на другой ExceptionMapper
У меня есть ExceptionMapper
которая является частью общей общей библиотеки:
@Provider
public class GenericExceptionMapper implements ExceptionMapper<GenericException> {
...
}
Теперь, в моем конкретном проекте, у меня есть свой ExceptionMapper
:
@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
...
}
Я хотел бы преобразовать SomeAdHocException
в GenericException
и разреши GenericExceptionMapper
нести ответственность за дальнейшую обработку. Я попробовал следующие два варианта, но оба не работают:
[1] бросок GenericException
в SomeAdHocExceptionMapper
:
@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
public Response toResponse(SomeAdHocException e) {
throw new GenericException(e);
}
}
[2] впрыскивать GenericExceptionMapper
в SomeAdHocExceptionMapper
:
@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
@Inject
private GenericExceptionMapper mapper;
public Response toResponse(SomeAdHocException e) {
return mapper.toResponse(new GenericException(e));
}
}
Оба варианта дают исключения зависимости.
Как мне это решить?
1 ответ
Ваша первая попытка не сработает, потому что для одного запроса можно вызвать только одно сопоставление исключений. Это функция безопасности, позволяющая избежать бесконечных циклов. Представить XExceptionMapper
бросает YException
во время обработки и YExceptionMapper
бросает XException
во время обработки.
Ваша вторая попытка не сработает, потому что картограф не для инъекций. Вы можете просто создать его экземпляр, хотя.
@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
private final GenericExceptionMapper mapper = new GenericExceptionMapper();
public Response toResponse(SomeAdHocException e) {
return mapper.toResponse(new GenericException(e));
}
}
Предполагая, что есть такой конструктор и что универсальный картограф не требует никаких собственных инъекций. Если это произойдет, вы можете сделать картограф для инъекций.
public class AppConfig extends ResourceConfig {
public AppConfig() {
register(new AbstractBinder() {
@Override
protected void configure() {
bindAsContract(GenericExceptionMapper.class);
}
});
}
}
Тогда вы сможете ввести его.