Как написать клиент REST, основанный на CXF, в TomEE?
Я хотел бы использовать мой REST-клиент, разработанный с CXF, с TomEE/TomEE+ 1.0, но у меня есть небольшая проблема с JAXB JSON marshalling/unmarshalling (с библиотекой Джексона). Я пробовал и Jersey Client 1.1.13, и CXF WebClient (версия, включенная в Tomee+ 1.0), но у меня возникает та же ошибка во время развертывания:
org.apache.openejb.OpenEJBException: нет доступных поставщиков для re f-ресурса 'null' типа 'javax.ws.rs.ext.Providers' для 'localhost/mywebapp.Comp'
Я также попытался скопировать jar 'jackson-jaxrs-json-provieder-2.0.4.jar' в каталог lib TomEE, но ошибка та же. Я также попытался установить системное свойство openejb.cxf.jax-rs.providers в com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider', но ничего не изменилось.
Вот пример кода, который я использую для вызова REST с CXF:
final List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
WebClient wc = WebClient.create(url, providers);
В любом случае этот код никогда не выполняется, потому что ошибка во время развертывания. Мое веб-приложение (версия, разработанная с помощью Jersey Client) работает на Glassfish 3.1.2.
В чем проблема?
Спасибо, пока, Демис
2 ответа
Я нашел хорошее временное решение для использования клиента CXF rest и сортировки JSON Джексона с TomEE+ 1.0.0. Я переместил эти библиотеки из библиотеки веб-приложений в каталог библиотеки TomEE:
- ДЖЕКСОН-аннотаций-2.0.4.jar
- ДЖЕКСОН-jaxrs-JSON-провайдер 2.0.4.jar
- ДЖЕКСОН-модуль-JAXB-аннотаций-2.0.4.jar
- ДЖЕКСОН-ядро-2.0.4.jar
- ДЖЕКСОН-DataBind-2.0.4.jar
И это мой код, чтобы сделать вызов покоя:
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false);
objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
final JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
provider.setAnnotationsToUse(JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
provider.setMapper(objectMapper);
final List<Object> providers = new ArrayList<Object>();
providers.add(provider);
WebClient wc = WebClient.create(_request.getUrl(), providers);
wc = wc.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON);
try {
res = (ElasticResponse) wc.invoke(_request.getHttpVerb(), _request.getMessage(), _request.getElasticResponseClass());
} catch (final ServerWebApplicationException _e) {
this._log.log(Level.FINE, "http response code > 400", _e);
}
Я надеюсь, что в следующем выпуске TomEE мне не нужно добавлять библиотеки Джексона в контейнер, а только в веб-приложение.
Нашел и исправил эту ошибку:
Попробуйте последний снимок TomEE.
Я использую jacskon (да, необходимо добавить jars и указать поставщика), и это работает.