RESTEASY003145: Не удалось найти средство чтения сообщений приложения типа содержимого/xml

#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);