我知道从安全角度来看,这种方法在 ActiveMQ Classic 中是不安全的。但是,在尝试执行以下操作时,将 ActiveMQ Artemis v2.32.0 与 ActiveMQ Classic 5.16.0 客户端结合使用会导致
ClassCastException
:
Map<String, String> map = genericCast(message.getObjectProperty(key))
它无法将
String
投射到 Map
。
与经典经纪商交互时,现有的客户端代码完全可以正常工作。
我不确定这是否是预期的行为,但我找不到明确的记录。如果不是预期的行为,我可以进一步查看是否可以为其编写测试用例。
您正在看到预期的行为。正如 JavaDoc 中针对
Message
所指出的:
方法仅返回类getObjectProperty
、Boolean
、Byte
、Short
、Integer
、Long
、Float
和Double
类的值。String
请注意,这不包括
Map
。
ActiveMQ Classic 支持这种行为的能力是 扩展,ActiveMQ Artemis 中并未引入。
一般来说,这样的扩展并不是一个好主意,因为它们会诱使开发人员破坏应用程序的可移植性。在许多情况下,这是长期损失的短期收益。在这种特定情况下,消息本身可以充当一种
Map
,因为您可以设置各种类型的键/值对,因此可能不需要首先将 Map
设置为属性。