2

CXFで開発されたRESTクライアントをTomEE/TomEE + 1.0で使用したいのですが、JAXB JSONマーシャリング/アンマーシャリング(Jacksonライブラリを使用)に少し問題があります。Jersey Client1.1.13とCXFWebClient(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をTomEElibディレクトリにコピーしようとしましたが、エラーは同じです。また、システムプロパティ「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);

とにかく、エラーはデプロイ時に発生するため、このコードは実行されません。私のウェブアプリ(Jersey Clientで開発されたバージョン)はGlassfish3.1.2で動作します。

問題はどこだ?

ありがとう、さようなら、デミス

4

2 に答える 2

3

このバグを見つけて修正しました:

最新のTomEEスナップショットをお試しください。

私はjacskonを使用し(はい、jarを追加し、プロバイダーを設定する必要があります)、それは機能します。

于 2012-07-24T18:56:22.123 に答える
1

私は、CXFレストクライアントとTomEE+1.0.0でのJacksonJSONマーシャリングを使用するための適切な一時的な解決策を見つけました。これらのライブラリをwebapplibからTomEElibディレクトリに移動しました。

  • 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呼び出しを行うための私のコードです:

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のライブラリをコンテナに追加する必要はなく、Webアプリケーションにのみ追加する必要があることを願っています。

于 2012-07-25T09:44:11.653 に答える