Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子spring对象与其超级java.util对象之间的显式类型转换_Java_Spring_Casting_Jms_Jdbctemplate - Fatal编程技术网

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

子spring对象与其超级java.util对象之间的显式类型转换,java,spring,casting,jms,jdbctemplate,Java,Spring,Casting,Jms,Jdbctemplate,在spring中,我使用jdbcTemplate,但有一个问题,即在查询列表时返回Linkedcaseinsensitivemap,在执行以下操作时,我仍然会得到spring Linkedcaseinsensitivemap,即使我将其转换为java util List并将赋值的左侧定义为java.util.List 首先,这怎么可能呢 final java.util.List<Map<String, Object>> list = (java.util.List<

在spring中,我使用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");
那么,一个人怎样才能实现这种上流社会呢? 不需要声明第二个列表,为它分配内存,然后手动将对象放入java.util.list

由于LinkedCaseSensitive是java对象的子类,我很难弄清楚如何转换到超级对象,即java列表。如何实现这一点目前仍是一个谜

由于目前无法知道哪些代理将使用我们的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);

}
那么,一个人是如何做到这一点的呢? 请帮忙
提前谢谢

这是我找到的唯一方法,让子对象成为它的父类而无需分解成方法-在我描述的场景中,执行以下操作:

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);

但在我看来并不好,如何才能以更正确的方式实现这一点

SQL select可以返回多行,每行有多个选定列。 您正在调用的返回一个列表,其中每个选定行都有一个将列名映射到列值的映射

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

如果您希望将结果列表发送给一个您不太了解的接收者,那么最好将其序列化为JSON并以文本消息的形式发送

您可以使用类似或的库序列化为JSON。创建一个序列化程序,并将要转换为字符串的对象提供给它。 例如,在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);
您也可以让SpringJMSTemplate使用一个可以转换为JSON的MessageConverter来为您实现这一点,但我估计这会有点难以实现

或者,如果您希望自定义作为ObjectMessage发送的映射,则可以使用它来指定一个自定义,以创建您喜欢的java.util.Map实现。请注意,如果使用树映射,它将按字母顺序对列进行排序;如果使用哈希映射,它将按随机顺序对列进行排序


然后,接收者可以将JSON解压回Java对象。gson.fromGsonjson将返回一个映射列表。

您正在将原始列表的内容复制到ArrayList,但内容仍然是特定于spring的链接hashmaps。不会,这已经过测试,得到了预期的结果。您没有更改任何映射,只需将它们的引用复制到ArrayList.AddAll方法AddAllCollections您的意思是映射实现是非标准的,然后将这些非标准映射从返回的ArrayList复制到新创建的ArrayList。这意味着只有列表不同,而不是其中的映射。是的,这是一个明显的选择,但在这种情况下,由于MQ处理的不仅仅是ResultSet,因此更希望将ResultSet作为在接收端解析的对象发送。当以纯文本形式发送其他信息时,即发送的对象类型将以不同方式处理,接收者将通过这种方式知道objectMessage包含结果集,而TextMessage包含错误或状态等其他信息。。此外,我觉得一条非常大的短信比一个列表更难处理,每行都有一张地图。只是好奇的是,接收者怎么知道收到了什么类型的短信?您会在每条消息中使用某种前缀来解决这个问题吗?您可以在JMS消息中提供标题,解释消息的内容。你也可以将不同类型的邮件发送到不同的目的地,尽管不同类型的邮件可能会被彼此无序地处理。是的,可以在邮件头中设置类型,你知道我开始看到发送所有内容的文本的价值。你能解释一下把它序列化为json是什么意思吗?你的意思是我应该更改可序列化的列表并将其放入json?创建一条jms消息,在jms中为类似resultset的类型指定头,然后只添加json t
是吗?我们的“我是不是误解了?”接收者然后可以将JSON解压回Java对象。gson.fromGsonjson将返回映射列表。使用接口列表发送LinkedCaseInsensitivemap有什么问题,这会导致任何问题吗?你想让它区分大小写吗?这就是问题所在吗?不能期望接收器使用spring框架。