1

現在、openstack4j ライブラリを使用して Bluemix のオブジェクト ストレージに接続しています。Java コードを Java アプリケーションとしてローカルで実行しようとすると、接続は機能しているように見えますが、Bluemix で Java Web アプリケーションと同じコードをデプロイすると、以下のエラーが発生します。認証メソッドを実行しようとすると、失敗するコードが発生します。

OSClient os = OSFactory.builderV3()
                 .endpoint(auth_url)
                 .credentials(username, password)
                 .scopeToProject(projectIdent, domainIdent)
                 .authenticate();

 Exception thrown by application class 'org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke:58'
org.openstack4j.api.exceptions.ConnectionException: org.apache.cxf.interceptor.Fault: No message body writer has been found for class org.openstack4j.openstack.identity.domain.v3.KeystoneAuth, ContentType: application/json
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke(HttpExecutorServiceImpl.java:58)
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.execute(HttpExecutorServiceImpl.java:33)
at org.openstack4j.core.transport.internal.HttpExecutor.execute(HttpExecutor.java:51)
at org.openstack4j.openstack.internal.OSAuthenticator.authenticateV3(OSAuthenticator.java:156)
at org.openstack4j.openstack.internal.OSAuthenticator.invoke(OSAuthenticator.java:78)
at org.openstack4j.openstack.client.OSClientBuilder$ClientV3.authenticate(OSClientBuilder.java:163)
at org.openstack4j.openstack.client.OSClientBuilder$ClientV3.authenticate(OSClientBuilder.java:127)
at com.ibm.sample.ObjectStorageService.(ObjectStorageService.java:36)
at wasdev.sample.servlet.SimpleServlet.doGet(SimpleServlet.java:30)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1290)
at [internal classes]
Caused by: javax.ws.rs.ProcessingException: org.apache.cxf.interceptor.Fault: No message body writer has been found for class org.openstack4j.openstack.identity.domain.v3.KeystoneAuth, ContentType: application/json
at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1206)
at [internal classes]
at org.openstack4j.connectors.jersey2.HttpCommand.execute(HttpCommand.java:79)
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invokeRequest(HttpExecutorServiceImpl.java:65)
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke(HttpExecutorServiceImpl.java:56)
... 12 more
Caused by: org.apache.cxf.interceptor.Fault: No message body writer has been found for class org.openstack4j.openstack.identity.domain.v3.KeystoneAuth, ContentType: application/json
at org.apache.cxf.jaxrs.client.WebClient$BodyWriter.doWriteBody(WebClient.java:1286)
... 16 more
Caused by: javax.ws.rs.ProcessingException: No message body writer has been found for class org.openstack4j.openstack.identity.domain.v3.KeystoneAuth, ContentType: application/json
at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:758)
... 16 more
Caused by: org.codehaus.jackson.map.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: org.openstack4j.openstack.identity.domain.v3.KeystoneAuth["id"])
at org.codehaus.jackson.map.JsonMappingException.wrapWithPath(JsonMappingException.java:215)
... 16 more
Caused by: java.lang.NullPointerException:
at org.openstack4j.openstack.identity.domain.v3.KeystoneAuth.getId(KeystoneAuth.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:285)
4

2 に答える 2

1

スタック トレースは、WebSphere Liberty Profile に含まれる jar ファイルのデフォルト セットと、OpenStack4J を使用して取り込まれた jar ファイルとの間の jar ファイルの競合によって発生します。最も可能性の高い原因は、Jersey の依存関係をプルする jaxrs-2.0 です。

Liberty プロファイルの Bluemix ドキュメントには、 https ://www.ng.bluemix.net/docs/#starters/liberty/index.html#liberty に自動的に含まれる jar ファイルがリストされています。

(そのページでこのテキストを検索してください: デフォルトの Liberty server.xml 構成ファイル全体は次のとおりです)

この問題を解決するには、アプリを通常どおり Bluemix にデプロイすると、上記のように失敗します。

次に、クラウド ファウンドリー コマンド (cf) を発行して、デフォルトの jar のリスト全体をロードしないように WebSphere Liberty に指示します。

以下は、WebSphere Liberty によってロードされた jar のデフォルト・リストを 2 つの jar ファイルだけにトリミングし、jaxrs を取り除く cf コマンドの例です。

cf set-env <your app name here> JBP_CONFIG_LIBERTY "app_archive: {features: [jsp-2.3, websocket-1.1]}"

上記のコマンドを発行した後、変更を有効にするために Liberty アプリを「再ステージング」する必要があります。

cf restage <your app name here>

この時点で、openstack4j 呼び出しが機能するはずです。コードに基づいて、このリストに何を含めるかを決定する必要があります。

{features: [jsp-2.3, websocket-1.1]}

クラスパスの競合を回避するためのオプションは他にもあります。OpenStack4J ソース コードをダウンロードし、pom ファイルを変更して依存関係を隠し、このカスタム バージョンの openstack4j を Bluemix で使用できます。

WebSphere Liberty の資料では、「リバース・クラス・ローディング」の使用が提案されていますが、それは最良のアプローチとは思えません。

于 2016-02-18T16:34:33.510 に答える
0

これは、開発マシンと Bluemix の Java 環境の違いによるものだと思います。これは、openstack または keystone に固有のものではありません。

次のスタック オーバーフローの問題を確認することをお勧めします。これは、多くの構成変更を示唆しています。

CXF: クラスのメッセージ本文ライターが見つかりません - 非単純なリソースを自動的にマッピングします

プロバイダーを制御できない場合は、Bluemix サポート チケットを開いて、どのプロバイダー/バージョンが環境に含まれているかを尋ねます。

于 2016-02-17T19:56:35.660 に答える