博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Can not deserialize instance of java.lang.String out of START_OBJECT token
阅读量:4179 次
发布时间:2019-05-26

本文共 3807 字,大约阅读时间需要 12 分钟。

通过OpenStack4j 3.0.4访问OpenStack Mitaka版本云实例的镜像服务(v2),发生如下异常:

Exception in thread "main" javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT tokenat [Source: org.jboss.resteasy.client.jaxrs.internal.ClientResponse$InputStreamWrapper@7f6f61c8; line: 1, column: 299] (through reference chain: org.openstack4j.openstack.image.v2.domain.Images["images"]->java.util.ArrayList[0]->org.openstack4j.openstack.image.v2.domain.GlanceImage["locations"]->java.util.ArrayList[0])                at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:300)                at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readEntity(ClientResponse.java:196)                at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:218)                at org.openstack4j.connectors.jersey2.HttpResponseImpl.readEntity(HttpResponseImpl.java:113)                at org.openstack4j.core.transport.HttpEntityHandler.handle(HttpEntityHandler.java:66)                at org.openstack4j.core.transport.HttpEntityHandler.handle(HttpEntityHandler.java:24)                at org.openstack4j.connectors.jersey2.HttpResponseImpl.getEntity(HttpResponseImpl.java:63)                at org.openstack4j.openstack.internal.BaseOpenStackService$Invocation.execute(BaseOpenStackService.java:225)                at org.openstack4j.openstack.internal.BaseOpenStackService$Invocation.execute(BaseOpenStackService.java:207)                at org.openstack4j.openstack.image.v2.internal.ImageServiceImpl.list(ImageServiceImpl.java:45)

而访问OpenStack云实例的镜像服务(v1),一切正常。

升级到最新的OpenStack4j 3.1.0(2017.9.22发布),遇到的问题一样。判断应该是OpenStack云实例的问题。

查看镜像服务(v2)的响应信息如下:

{...,"locations": [{	"url": "rbd://.../images/.../snap",	"metadata": {}}],...}

显然,locations属性的值是一个数组,而数组的类型具有一定的结构,而非简单的字符串。所以OpenStack4j在试图将收到的响应信息逆序列化时发生了异常。

而镜像服务(v1)的响应信息中没有任何locations属性。

查看OpenStack4j的源代码,发现其最新的master分支上,镜像服务(v2)代码如下:

package org.openstack4j.model.image.v2public interface Image ... {  ...  List
getLocations(); ...}

而镜像服务(v1)代码如下:

package org.openstack4j.model.imagepublic interface Image ... {  ...  String getLocation();  ...}

镜像服务(v2)代码中,locations属性是个Location类型的列表;镜像服务(v1)代码中,location属性是字符串类型。两者都没毛病。

但是且慢,镜像服务(v2)代码的最后一次提交信息如下:

与我们遇到的问题是一样的,而其提交代码的日期是2017.10.6。回顾最新的OpenStack4j 3.1.0是2017.9.22发布的。原来这是OpenStack4j的一个bug,虽然很快被fix,但是由于一直未发布新版本,所以大家使用的OpenStack4j都存在该问题。

那么我们使用的OpenStack4j 3.1.0中的代码啥样呢,如下所示:

package org.openstack4j.model.image.v2public interface Image ... {  ...  List
getLocations(); ...}

果然locations属性的类型是String的列表,但实际上应该是org.openstack4j.openstack.image.v2.domain.GlanceImage.Location的列表。

这么显而易见的问题,为什么OpenStack4j这么久没有再发布新版本予以解决呢?

查看OpenStack的镜像服务文档,我终于找到了答案。原来,出于安全的考虑,默认location相关的信息不会出现在请求的响应中,而且在响应中出现多个location相关的配置属性已经过时了,新版本OpenStack中几乎不可能出现多个location的列表。

在OpenStack的镜像服务中,决定响应信息中的属性的是glance-api.conf配置文件。而决定location相关的信息是否返回给请求的配置参数是show_multiple_locationsshow_image_direct_url

在OpenStack Mitaka版本中,配置如下:

    show_multiple_locations=false#覆盖show_image_direct_url属性    show_image_direct_url=false#

在OpenStack Newton版本中,配置如下:

    show_multiple_locations=false#已经过时了    show_image_direct_url=false

在OpenStack Ocata版本中,配置如下:

    show_multiple_locations=false#被忽略,计划在OpenStack Pike版本中删除,但是在Rocky版本中仍然存在    show_image_direct_url=false#

 

参考链接:

https://github.com/ContainX/openstack4j/blob/master/core/src/main/java/org/openstack4j/model/image/v2/Image.java

https://github.com/ContainX/openstack4j/blob/master/core/src/main/java/org/openstack4j/model/image/Image.java
https://docs.openstack.org/mitaka/config-reference/image-service.html
https://docs.openstack.org/ocata/config-reference/image.html
https://github.com/openstack/glance/blob/master/etc/glance-api.conf

你可能感兴趣的文章
记录go数据库操作的bug——max_prepared_stmt_count,附分析过程
查看>>
go中map与xml互转
查看>>
java进程占用CPU过高
查看>>
CSDN-markdown编辑器
查看>>
拷贝整个目录到另一台服务器并排除log目录
查看>>
拜托,面试别再问我跳表了!
查看>>
linux驱动实例
查看>>
android ArrayList<String> 转 String[]
查看>>
RecyclerView baseadapter
查看>>
Android中应用程序如何获得系统签名权限
查看>>
MPAndroidChart 动态更新
查看>>
Recycler表格(excelPanel)
查看>>
android一行代码实现沉浸式布局效果
查看>>
json, recyclerView问题
查看>>
cmake处理多源文件目录的方法
查看>>
Service Intent must be explicit
查看>>
android studio SDK开发
查看>>
studio 统计代码的行数
查看>>
字符数组和16进制互换
查看>>
德鲁伊druid 数据源配置
查看>>