Java 当主体不可分配给类时,如何调试JMS?

Java 当主体不可分配给类时,如何调试JMS?,java,debugging,jakarta-ee,jms,Java,Debugging,Jakarta Ee,Jms,我正在使用JavaEEJMS队列。我将对象发送到队列中,然后使用MDB接收它们。将消息正文(使用getBody()读取到对象中时,我会遇到以下异常: javax.jms.MessageFormatException: Body not assignable to class ... 有没有办法从中得到一个更具描述性的错误,从而说明为什么它是不可赋值的?我还尝试进入调试模式,查看什么类型的消息对象到达MDB,但据我所知,它是序列化的,因此没有真正的用处 在将对象类型发送到队列之前,已在调试器中正

我正在使用JavaEEJMS队列。我将对象发送到队列中,然后使用MDB接收它们。将消息正文(使用getBody()读取到对象中时,我会遇到以下异常:

javax.jms.MessageFormatException: Body not assignable to class ...
有没有办法从中得到一个更具描述性的错误,从而说明为什么它是不可赋值的?我还尝试进入调试模式,查看什么类型的消息对象到达MDB,但据我所知,它是序列化的,因此没有真正的用处

在将对象类型发送到队列之前,已在调试器中正确识别该对象类型

附加信息:如果我手动创建一个空对象并发送它,它会被正确识别。生产对象来自REST端点,包含许多属性,并在过程中多次转换。某些数据必须阻止赋值,但一步一步地调试每个属性将是一件痛苦的事情,而且只能作为最后的手段

对象已确认可按中的每个答案序列化

对象被发送为:
jmsContext.createProducer().send(队列,对象)

我将所有属性设置为null,然后逐一注释,直到它起作用,从而缩小了范围。结果是持续时间类型属性不正确?导致问题的原因。在另一个案例中,是XMLGregorianCalendar属性导致了它。 尽管如此,这是一种非常粗糙的调试方式,我仍然不知道分配失败的确切原因,我只知道是哪个属性导致了它

目前,我将实体ID传递到队列中,而不是传递完整的对象,并通过ID从数据库中检索它们


完整stacktrace的Pastebin:

您放入队列中的对象的整个图形必须在MDB中导入和访问。包括标准格式,如
java.util.Gregoriacalendar

一个好的设计(如果您现在可以控制它,这意味着它是一个尚未投入生产的新应用程序)可能是使用json有效负载,这样您可以随时将有效负载视为文本,像jackson这样的json反序列化程序会抛出更好的异常


Gregorian日历对于xml序列化来说是痛苦的,至少根据我的经验,您最好使用joda time之类的工具。

读取消息的MDB是否可以访问它试图读取的对象的类文件?该类已导入,Eclipse没有报告任何关于它的警告或错误,因此我假设是。可以查看发送方和MDB的示例?对象已序列化,但MQ服务器能够处理提供的原始数据。您是否将byte[]结果作为byteMessage发送?()在编辑中添加了更多信息。我不是以BytesMessage的形式发送它。我也同意Antoine的说法,您可能在某个地方有一个嵌套类not found exception。您能粘贴整个堆栈跟踪(包括所有嵌套的异常)吗?这会很有帮助。我分配给的类是导入的,因此根据定义,所有成员类也应该导入,对吗?不,所有成员类都不会自动导入。@Mahesh给出了很好的建议:拥有有效负载(文本版本)对象图的属性将允许您更轻松地进行单元测试和调试。发送对象的EJB和Mdb位于同一EAR模块中,因此它们应该具有相同的导入依赖项和可用依赖项。除非您打算在ejb类中显式地导入它们,但这对我来说没有任何意义。可能是一个好建议,唯一的问题是我将对象重新序列化为json,因为我们使用调用ejb作为SOAP webservice,rest端点调用它。所以Rest->反序列化->Ejb->序列化->Jms。这是可行的,但似乎与我们目前的设计相冲突。