Java 对象的集合包含可序列化的非基本对象,可以';不能设置为ActiveMQ ObjectMessage

Java 对象的集合包含可序列化的非基本对象,可以';不能设置为ActiveMQ ObjectMessage,java,serialization,collections,jms,activemq,Java,Serialization,Collections,Jms,Activemq,我非常感谢你在这方面的帮助 我有一个对象,我正试图通过调用setObject在JMS ObjectMessage中发送。此对象包含HashMap内容以及一些其他字段。当映射包含基本元素时,消息构建良好。同样,如果我向对象添加一个非原语序列化字段,它也会发送ok 问题是:每当我尝试向映射添加可序列化的非基本体对象时,我都会收到以下消息FormatException: javax.jms.MessageFormatException: Only objectified primitive objec

我非常感谢你在这方面的帮助

我有一个对象,我正试图通过调用setObject在JMS ObjectMessage中发送。此对象包含HashMap内容以及一些其他字段。当映射包含基本元素时,消息构建良好。同样,如果我向对象添加一个非原语序列化字段,它也会发送ok

问题是:每当我尝试向映射添加可序列化的非基本体对象时,我都会收到以下消息FormatException:

javax.jms.MessageFormatException: Only objectified primitive objects, String, 
Map and List types are allowed but was: com.abc.ObjectInList
ObjectMessage的javadoc指定

只能使用可序列化的Java对象

。。。检查。而且

如果必须发送Java对象的集合,则可以使用自JDK1.2以来提供的集合类之一

。。。仔细检查。虽然这并没有具体说明集合中的可序列化对象,但我想我会假设这是受支持的。我做错什么了吗?我只是咬紧牙关,在我的顶级对象中创建一个新字段,这样我就不必把它放在集合中了吗

使用ActiveMQ 5.2。随后是一个相关的堆栈跟踪

2011-08-01 21:06:05767错误javax.jms.MessageFormatException:只允许对象化的基本对象、字符串、映射和列表类型,但为:com.abc.engine.ejb。BasicSchedule@58f295b9类型:c类 om.abc.engine.ejb.BasicSchedule 2011-08-01 21:06:05767 org.apache.activemq.command.ActiveMQMessage.checkValidObject(ActiveMQMessage.java:468)处出错 2011-08-01 21:06:05767 org.apache.activemq.command.ActiveMQMapMessage.setObject(ActiveMQMapMessage.java:705)处出错 2011-08-01 21:06:05767 com.abc.chronicle.ejb.ChronicleMessageBean.initMessage(ChronicleMessageBean.java:149)上的错误 2011-08-01 21:06:05767 com.abc.chronicle.ejb.ChronicleMessageBean.send上的错误(ChronicleMessageBean.java:125) 2011-08-01 21:06:05767 com.abc.chronicle.ejb.ChronicleMessageBean.onMessage(ChronicleMessageBean.java:77)出错 2011-08-01 21:06:05767 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)出错2011-08-01 21:06:05768 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)出错 2011-08-01 21:06:05777错误[com.abc.chronicle.ejb.chronizeMessageBean]JMS异常向SDK发送消息。传出通知:javax.JMS.MessageFormatException:仅对象化的原始对象、字符串、Ma 允许使用p和列表类型,但was:com.abc.engine.ejb。BasicSchedule@1003b2df类型:class com.abc.engine.ejb.BasicSchedule 2011-08-01 21:06:05778错误javax.jms.MessageFormatException:只允许对象化的基本对象、字符串、映射和列表类型,但为:com.abc.engine.ejb。BasicSchedule@1003b2df类型:c类 om.abc.engine.ejb.BasicSchedule 2011-08-01 21:06:05778 org.apache.activemq.command.ActiveMQMessage.checkValidObject(ActiveMQMessage.java:468)处出错 2011-08-01 21:06:05778 org.apache.activemq.command.ActiveMQMapMessage.setObject(ActiveMQMapMessage.java:705)处出错 2011-08-01 21:06:05778 com.abc.chronicle.ejb.chronizeMessageBean.initMessage(chronizeMessageBean.java:149)上的错误 2011-08-01 21:06:05778 com.abc.chronicle.ejb.ChronicleMessageBean.send上的错误(ChronicleMessageBean.java:125) 2011-08-01 21:06:05778 com.abc.chronicle.ejb.ChronicleMessageBean.onMessage(ChronicleMessageBean.java:77)出错


虽然我还没有检查它,但看看下面的示例,当ActiveMQ验证消息属性时,您似乎遇到了此异常,而不是验证正文。for
ObjectMessage
的内容如下:

只能使用可序列化的Java对象

我在ActiveMQ(Arbitral complex)中使用了各种各样的Java对象,而且一直都很有效。但是,在设置消息属性()时:

请注意,此方法仅适用于对象化的基本对象类型(
Integer
Double
Long
…)和
String
对象

检查上面引用的ActiveMQ代码库,看起来您正试图使用消息对象属性发送复杂的Java对象。这滥用了消息属性的概念,消息属性应该是简单的元数据,如ID或对等名称


另外,ActiveMQ还可以选择支持
Map
List
,但这是特定于供应商的。

消息接口中有一条消息。setObjectProperty(Object),但是,我使用的是ObjectMessage子类和方法。此外,我使用的所有对象都是extend SerializableOK,您能否将此
MessageFormatException
的堆栈跟踪添加到您的问题中?我再也不能只看ActiveMQ代码库了。感谢您的关注-问题中包含了跟踪(很抱歉格式化)
Chronicle MessageBean
中的第149行在您的代码中是什么样子的?我有理由相信您使用的是
MapMessage
,而不是
ObjectMessage
。看起来您使用的版本与5.2.0略有不同,但这并不重要。你确定你已经创建了
ObjectMessage
?我也有同样的问题。我在骆驼论坛上发布了一个测试程序:。这个错误有修复程序吗?