#resteasy #quarkus #quarkus-rest-client
Вопрос:
Я пытаюсь создать первый проект Quarkus. В этом проекте мне нужно импортировать интерфейс службы Jax-rs из другого пакета и использовать его в клиенте для вызова службы. Таким образом, я использую RestClientBuilder, в отличие от подхода, основанного на @RegisterRestClient, поскольку я не контролирую интерфейс JaxRS.
RestClientBuilder.newBuilder()
.baseUri(URI.create("https://myexcelentserver"))
.register(new BasicAuthentication("nonono", "badbad"))
.sslContext(getSSLContext(certPath.orElse(null))) //Handling self-signed cert
.build(ConfigurationService.class);
И зависимости (среди прочего)
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jaxb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jaxb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jaxb</artifactId>
</dependency>
Однако в итоге я получаю исключение
javax.ws.rs.Исключение обработки: RESTEASY003145: Не удается найти средство чтения сообщений приложения/xml типа содержимого и класса типа eu.sos.cicso.configservice.api.модель.агент.Агент
Это не совсем ожидаемый результат, поэтому вместо этого я попытался сделать следующее
RestClientBuilder.newBuilder()
.baseUri(URI.create("https://myexcelentserver"))
.register(new BasicAuthentication("nonono", "badbad"))
.register(new LoggingFilter())
.register(new JAXBXmlRootElementProvider())
.sslContext(getSSLContext(certPath.orElse(null)))
.build(ConfigurationService.class);
Добавление фильтра ведения журнала и плагинов org.jboss.resteasy.провайдеры.jaxb.JAXBXmlRootElementProvider. Ошибка в том, что теперь
org.jboss.resteasy.плагины.providers.jaxb.JAXBUnmarshalException: RESTEASY006510: Не удалось найти JAXBContextFinder для типа носителя: приложение/xml
Через фильтр ведения журнала я вижу, что вывод является допустимым XML, как и ожидалось. Я также использовал интерфейс ConfigurationService в прокси-клиенте CXF из чистого отчаяния, и это сработало без проблем. Я также попытался (в другом акте отчаяния) использовать провайдера CXF JaxB, но Кварку, похоже, НЕ понравились все дополнительные зависимости, которые были задействованы, и приложение даже не запустилось.
Так что же я делаю не так? Похоже, я где-то что-то неправильно настраиваю, но у меня совершенно нет идей относительно того, что именно.
Ответ №1:
Что ж, в конце концов это оказалось довольно очевидным. Похоже, что RestClientBuilder делает очень мало, если вообще что-то делает, для автоматического открытия классов в вашем пути к классам. Я решил проблему, просто зарегистрировав отсутствующий класс, который, к счастью, прятался в той же банке, что и поставщик элементов.
RestClientBuilder.newBuilder()
.baseUri(URI.create(hostName))
.register(new LoggingFilter())
.register(new JAXBXmlRootElementProvider())
.register(new XmlJAXBContextFinder())
.build(ConfigurationService.class);