Примечание. Это частичный ответ, поскольку я еще не понял его для всех случаев.
Если вы посмотрите на источник для JerseyInvocation
, вы увидите метод invoke(Class responseType)
, который вызывается, когда мы делаем запрос, передавая параметр класса, в который мы хотим десериализовать ответ.Это то, что вы использовали здесь, передавая Product.class
target.path("123!").request(APPLICATION_JSON).get(Product.class);
Глядя на источник для метода invoke()
, мы можем увидеть
return requestScope.runInScope(new Producer<T>() {
@Override
public T call() throws ProcessingException {
try {
return translate(runtime.invoke(requestForCall(requestContext)), requestScope, responseType);
} catch (final ProcessingException ex) {
if (ex.getCause() instanceof WebApplicationException) {
throw (WebApplicationException) ex.getCause();
}
throw ex;
}
}
});
Метод translate
что включает исключение в ProcessingException
.Если вы посмотрите на пару строк после catch
, вы должны увидеть нашу возможность для обхода.Если причиной исключения является WebApplicationException
, то это исключение будет выдано.Итак, ваш обходной путь - сделать ShopException
продление WebApplicationException
.
Теперь я говорю, что это только частичный ответ, потому что это не работает, когда вы просто хотите Response
вернуться из запроса
Response res = target.path("123!").request(APPLICATION_JSON).get();
Когда вы это делаете, вызывается invoke()
(без аргументов) .Он не делает то же самое, что предыдущий метод invoke()
.Так что, если вы можете понять это, то у вас есть полное решение.
Другой обходной путь - просто поймать ProcessingException
себя и бросить, отбросить причину.Если вы создаете SDK, это все равно будет сделано без ведома пользователя.