Ibm cloud 使用openstack4j在Bluemix中部署对象存储时出错

Ibm cloud 使用openstack4j在Bluemix中部署对象存储时出错,ibm-cloud,openstack,object-storage,Ibm Cloud,Openstack,Object Storage,我目前正在使用openstack4j库连接到Bluemix中的对象存储。当我尝试将java代码作为java应用程序在本地运行时,连接似乎可以工作,但当我在Bluemix中部署与java web应用程序相同的代码时,我得到以下错误。当我尝试执行authenticate方法时,出现了失败的代码: OSClient os = OSFactory.builderV3() .endpoint(auth_url) .credentials(

我目前正在使用openstack4j库连接到Bluemix中的对象存储。当我尝试将java代码作为java应用程序在本地运行时,连接似乎可以工作,但当我在Bluemix中部署与java web应用程序相同的代码时,我得到以下错误。当我尝试执行authenticate方法时,出现了失败的代码:

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)

我相信这是由于java环境的不同,从您的开发机器到Bluemix。它不是特定于openstack或keystone的

我建议查看以下堆栈溢出问题--它建议进行一些配置更改:


如果您无法控制提供者,我会打开Bluemix支持票证,询问哪些/哪些版本是环境的一部分

堆栈跟踪是由WebSphere Liberty概要文件中包含的默认jar文件集与使用OpenStack4J拉入的jar文件之间的jar文件冲突引起的。最有可能的罪魁祸首是jaxrs-2.0,它提取了Jersey依赖项

Liberty概要文件的Bluemix文档列出了此处自动包含的jar文件:

(在该页面上搜索此文本:整个默认的Liberty server.xml配置文件如下所示)

要解决此问题,请按正常方式将您的应用程序部署到Bluemix。根据上述说明,它将失败

然后发出CloudFoundry命令(cf),指示WebSphereLiberty不要加载其默认JAR的整个列表

下面是一个示例cf命令,它将WebSphere Liberty加载的jar的默认列表缩减为仅2个jar文件,并删除JAXR:

cf set-env <your app name here> JBP_CONFIG_LIBERTY "app_archive: {features: [jsp-2.3, websocket-1.1]}"
还有其他避免类路径冲突的选项。您可以下载OpenStack4J源代码,修改pom文件以隐藏依赖项,并将此自定义版本的OpenStack4J与Bluemix一起使用


WebSphere Liberty文档建议使用“反向类加载”,但这听起来不是最好的方法。

+1当我尝试作为单独的web应用程序(POC用途)时,这对我来说很有效,但当我在集成环境中也这样做时。它不起作用。导致同样的问题?任何指针?我通过反向类加载解决了这个问题。。。设置最后加载父类。是的,反向加载是另一个选项。很高兴你能成功!一般来说,反向类加载对我来说就像是一种黑客行为,所以我选择在我的环境中不这样做。
cf restage <your app name here>
{features: [jsp-2.3, websocket-1.1]}