【问题标题】:Map in ActiveMQ ObjectMessage throws ClassCastException: cannot assign instance of java.util.CollSer?ActiveMQ ObjectMessage 中的映射抛出 ClassCastException:无法分配 java.util.CollSer 的实例?
【发布时间】:2021-01-07 23:29:37
【问题描述】:

我正在使用 JMS ObjectMessage 和 ActiveMQ 在其 setObject() 函数中传输可序列化的 POJO。

在我的客户端上:

ObjectMessage omsg = getSession().createObjectMessage();
omsg.setObject(objectToSend);

objectToSend 是一个包含 Map 的 POJO:

private Map<Integer, Double> tickIdToPrice;

在我的服务器上我尝试解码:

if (omsg.getObject() instanceof AJavaClass) {

但这会导致Exception

java.lang.ClassCastException: cannot assign instance of java.util.CollSer 
    to field com.x.z.y.RequestPriceResult.tickIdToPrice of type 
    java.util.Map in instance of com.x.z.y.RequestPriceResult

有人知道是什么导致了这个异常吗?关于CollSer 的信息很少。

【问题讨论】:

  • 如果可能的话,我会劝阻你不要使用ObjectMessageObjectMessage 依赖于 Java 序列化来(取消)编组通常被认为不安全的有效负载,因为恶意有效负载可以利用主机系统。 Lots of CVEs 已为此创建。还有许多其他与安全无关的问题,您应该read about。这篇文章对如何使用JSON等替换ObjectMessage有很好的建议
  • 除了ObjectMessage 的架构和安全问题之外,值得注意的是Java 序列化也
  • 干杯@JustinBertram,SERIALIZABLE_PACKAGES 设置不能解决大多数序列化安全问题吗?我目前正在使用 DTO 作为 objectmessage,并且仍然非常喜欢 java 序列化的易用性。随着项目变得更加成熟,我可能会转向 protobuff 作为有效载荷。
  • 将允许反序列化的包列入白名单有助于减少安全问题,但不一定能消除这些问题。而且你仍然有性能和架构问题。 ActiveMQ 5.x 和ActiveMQ Artemis 都是多协议代理。通过使用ObjectMessage,您将客户端锁定到Java 和JMS。例如,您不能使用 Python 的 STOMP 或 JavaScript 或 C# 的 AMQP。也许您现在不需要这种灵活性,但将来可能会。现在在没有明确的显着好处的情况下限制自己似乎是不明智的。

标签: java activemq spring-messaging


【解决方案1】:

找到了。

ColSet 定义为:

A unified serialization proxy class for the immutable collections.

在我的客户端上,我使用Map.of 创建地图。这创建了一个不可变映射,在序列化时使用 CollSer。这导致 activemq 出现问题,使用普通的可变映射序列化并且工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 2019-04-09
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多