Джерси 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));
    }
}

Оба варианта дают исключения зависимостей.

Как мне это решить?


person Twain Dres    schedule 04.05.2017    source источник


Ответы (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);
            }
        });
    }
}

Тогда вы сможете ввести его.

person Paul Samsotha    schedule 04.05.2017