繁体   English   中英

子spring对象与其超级java.util对象之间的显式类型转换

[英]Explicit type conversion between child spring object, and it's super java.util object

在春季,我使用的是jdbcTemplate,但有一个问题,即在查询列表时返回了Linkedcaseinsensitivemap,即使执行以下操作,我仍然会获得spring linkedcaseinsensitivemap,即使我将其强制转换为Java util List并定义了左侧分配为java.util.List。

首先,那怎么可能?

final java.util.List<Map<String, Object>> list = (java.util.List<Map<String, Object>>) jdbc
          .queryForList("SELECT * FROM customer");

那么,一个实现者将如何进行这种this割呢? 无需声明第二个列表为其分配内存,然后将对象手动放入java.util.List?

由于LinkedCaseInsensitive是java对象的子类,因此Im很难确定如何将其强制转换为java List的超级对象。 目前,如何实现这一目标是一个谜。

由于目前无法知道哪个经纪人将使用我们的AMQ,因此目标太严格地保留给jms对象,因此我无法开始发送spring对象,因为jms应该是我们的标准,还请注意,我没有实现AMQProtocol的选项,我需要发送基本的Java对象,

由于已建议序列化为JSON,因此我将解释为什么在这种情况下它不起作用,为什么我需要按原样将对象发送给接收者,因为它们会将其放入Notes文档中。

for (int i = 1; i <= metadata.getColumnCount(); i++) {
                String columnName = metadata.getColumnName(i);
                Object values = sqlConnection.getRset().getObject(i);
                doc.replaceItemValue(columnName, values);

}

那么,人们如何才能做到这一点呢?
请提前帮助谢谢!

SQL select可以返回多行,并且每一行都有多个选定的列。 您正在调用的queryForList方法返回一个List,该列表为每个选定的行提供一个将列名映射到列值的Map。

Map和List是接口,因此Spring可以自由选择喜欢的实现。 它为地图选择LinkedCaseInsensitiveHashMap,因为该地图将按插入顺序列出键。 因此,选择列的顺序不会丢失。

如果您希望将结果列表发送给几乎不了解的接收器,则可能最好将其序列化为JSON并以文本消息的形式发送。

您可以使用GsonJackson2之类的库将其序列化为JSON。 您创建一个序列化器,并将要转换为String的对象输入该序列化器。 例如,在Gson中,序列化程序类称为Gson:

TextMessage message;
// initialize message and headers however you like
// then serialize it to String:
Gson gson = new Gson();
String json = gson.toJson(list);
// and set it in the message:
message.setText(json);

(您还可以让Spring JmsTemplate使用一个可以转换为JSON的MessageConverter来为您执行此操作,但我估计这样做有点困难。)

另外,如果您希望自定义作为ObjectMessage发送的Map,则可以使用其他查询方法 ,该方法允许您指定一个自定义RowMapper来创建自己喜欢的java.util.Map实现。 请注意,如果使用TreeMap,则将按字母顺序对列进行排序;如果使用HashMap,则将其按随机顺序放置。

然后,接收者可以将JSON解压缩到Java对象中。 gson.fromGson(json)将返回地图列表。

这是我弄清楚如何使子对象成为其父类而又不涉及方法的唯一方法-在我描述的场景中,执行以下操作:

final java.util.ArrayList<java.util.Map<String, Object>> javaList = new java.util.ArrayList<java.util.Map<String, Object>>();
        final java.util.List<java.util.Map<String, Object>> list = jdbc
                  .queryForList("SELECT * FROM customer");
        javaList.addAll(list);

但是对我来说不好看,如何以一种更正确的方式实现呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM