首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在TomEE中编写基于CXF的REST客户端?

如何在TomEE中编写基于CXF的REST客户端?
EN

Stack Overflow用户
提问于 2012-07-11 22:33:34
回答 2查看 2.5K关注 0票数 2

我想使用我的REST客户端,使用CXF开发,使用TomEE/TomEE+ 1.0,但我对JAXB JSON编组/解组(使用Jackson库)有一点问题。我尝试了Jersey Client 1.1.13和CXF WebClient ( Tomee+ 1.0中包含的版本),但在部署时遇到了相同的错误:

org.apache.openejb.OpenEJBException:没有提供程序可用于资源- 'localhost/mywebapp.Comp‘的类型为'javax.ws.rs.ext.Providers’的引用'null‘

我还尝试将'jackson-jaxrs-json-provieder-2.0.4.jar‘jar复制到TomEE库目录,但错误是相同的。我还尝试将系统属性'openejb.cxf.jax-rs.providers‘设置为'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider',,但没有任何更改。

下面是我用CXF进行REST调用的代码示例:

代码语言:javascript
运行
复制
final List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
WebClient wc = WebClient.create(url, providers);

无论如何,这段代码永远不会执行,因为错误是在部署时发生的。我的webapp (用Jersey Client开发的版本)可以在Glassfish 3.1.2上运行。

问题出在哪里?

谢谢你,再见,戴米斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-25 17:44:12

我找到了一个很好的临时解决方案,可以在TomEE+ 1.0.0中使用CXF rest client和Jackson JSON编组。我将这些库从webapp lib移动到TomEE lib目录:

  • jackson-annotations-2.0.4.jar
  • jackson-jaxrs-json-provider-2.0.4.jar
  • jackson-module-jaxb-annotations-2.0.4.jar
  • jackson-core-2.0.4.jar
  • jackson-databind-2.0.4.jar

下面是我进行rest调用的代码:

代码语言:javascript
运行
复制
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中,我不需要将杰克逊的库添加到容器中,而只需要添加到webapp应用程序中。

票数 1
EN

Stack Overflow用户

发布于 2012-07-25 02:56:22

找到并修复了此错误:

试试最新的TomEE snapshot

我使用jacskon (是的,需要添加jars并设置提供者),它可以工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11434991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档