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

时间:2012-07-11 14:33:34

标签: rest cxf jax-rs apache-tomee

我想使用我的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 lib目录,但错误是一样的。 我还尝试将系统属性'openejb.cxf.jax-rs.providers'设置为'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider',但没有任何改变。

以下是我用来与CXF进行REST调用的代码示例:

final List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
WebClient wc = WebClient.create(url, providers);

无论如何这段代码从未执行过,因为错误发生在部署时。 我的webapp(使用Jersey Client开发的版本)适用于Glassfish 3.1.2。

问题出在哪里?

谢谢你, 再见, 杰米斯

2 个答案:

答案 0 :(得分:3)

找到并修复了这个错误:

尝试最新的TomEE snapshot

我使用jacskon(需要添加jars并设置提供程序)并且它可以正常工作。

答案 1 :(得分:1)

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

  • 杰克逊 - 注解-2.0.4.jar
  • 杰克逊 - JAXRS-JSON-提供商-2.0.4.jar
  • 杰克逊模块-JAXB的注解-2.0.4.jar
  • 杰克逊 - 芯 - 2.0.4.jar
  • 杰克逊 - 数据绑定-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的下一个版本中,我不需要将Jackson的库添加到容器中,而只需要添加到webapp中。