【问题标题】:How to write a REST client, based on CXF, in TomEE?如何在 TomEE 中编写基于 CXF 的 REST 客户端?
【发布时间】:2012-07-11 14:33:33
【问题描述】:

我想使用使用 CXF 开发的 REST 客户端和 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 客户端开发的版本)在 Glassfish 3.1.2 上运行。

问题出在哪里?

谢谢你, 再见, 德米斯

【问题讨论】:

    标签: rest cxf jax-rs apache-tomee


    【解决方案1】:

    发现并修复了这个错误:

    试用最新的 TomEE snapshot

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

    【讨论】:

    • 您好,感谢您的支持。我希望很快会有 TomEE 1.1 的最终版本,但我会在生产环境中使用稳定版本。
    【解决方案2】:

    我找到了一个很好的临时解决方案,可以在 TomEE+ 1.0.0 中使用 CXF REST 客户端和 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

    这是我进行休息调用的代码:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多