关于ActiveMQ序列化对象爆“Forbidden class xxx! ...”问题的解决

如题所示,最开始使用了默认配置:

<amq:connectionFactory id="amqConnectionFactory"
		brokerURL="tcp://${activemq.ip}:61616" userName="${activemq.username}"
		password="${activemq.passwd}" />

然后使用ActiveMQ对对象进行序列化时报了如下错误:

Caused by: java.lang.ClassNotFoundException: Forbidden class cn.zifangsky.model.User! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.
 at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.checkSecurity(ClassLoadingAwareObjectInputStream.java:112)
 at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:57)
 at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
 at java.io.ObjectInputStream.readClassDesc(Unknown Source)
 at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
 at java.io.ObjectInputStream.readObject0(Unknown Source)
 at java.io.ObjectInputStream.readObject(Unknown Source)
 at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:206)
 ... 13 more

关于这个错误,其实在报错的提示里面已经给出了官方的解决方案的地址,即:http://activemq.apache.org/objectmessage.html

出现这个问题的原因在于:从ActiveMQ5.12.2 开始,为了增强这个框架的安全性,ActiveMQ将强制用户配置可序列化的包名。因此具体的解决方案如下:

按照官方的提示修改“ActiveMQ 连接工厂”的配置:

<bean id="amqConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
	<property name="brokerURL" value="tcp://${activemq.ip}:61616"/>
	<property name="userName" value="${activemq.username}" />
	<property name="password" value="${activemq.passwd}" />
	<property name="trustedPackages">
		<list>
			<value>java.lang</value>
			<value>javax.security</value>
			<value>java.util</value>
			<value>org.apache.activemq</value>
			<value>cn.zifangsky.activemq</value>
			<value>cn.zifangsky.model</value>
		</list>
	</property>
</bean>

这里添加上信任的可序列化的包即可

如果不想一个个地添加的话,也可以使用“trustAllPackages”参数:

<bean id="amqConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
	<property name="brokerURL" value="tcp://${activemq.ip}:61616"/>
	<property name="userName" value="${activemq.username}" />
	<property name="password" value="${activemq.passwd}" />
	<property name="trustAllPackages" value="true"/>
</bean>

注:官方还提示可以给activemq.bat文件(PS:D:/apache-activemq-5.14.1/bin/activemq.bat)添加信任的包名。也就是修改文件中的“ACTIVEMQ_OPTS”参数,在这行参数后面添加如下的配置:

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,cn.zifangsky.activemq,cn.zifangsky.model

但是经过尝试我发现并没有效果,其实仅仅只是修改“ActiveMQ 的连接工厂”那段配置就可以解决这个问题了

最后测试效果如下:

	@Test
	public void testObject(){
		User u = new User((long) 1,"test","123456");

		queueSender2.send("object.queue", u);
	}

运行这个方法之后,输出如下:

接收到消息: User [id=1, username=test, password=123456]

可以发现,问题成功解决了

时间: 2024-08-27 03:46:30

关于ActiveMQ序列化对象爆“Forbidden class xxx! ...”问题的解决的相关文章

EF中Json序列化对象时检测到循环引用的解决办法

第一种方法:使用Newtonsoft.Json中的方法注释,在Json序列化的时候忽略导航属性 例:using Newtonsoft.Json; public class Users { public int Id { get; set; } public string LoginId { get; set; } public string LoginPwd { get; set; } [JsonIgnore] public virtual ICollection Roles { get; se

Android中Serializable和Parcelable序列化对象详解

学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例 1.序列化的目的 (1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 (2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式) (3).将对象数据在进程

Android中序列化对象到XMl 和 XML反序列化为对象

package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; imp

Hessian RPC示例和基于Http请求的Hessian序列化对象传输

本文主要介绍两个案例,第一个是使用Hessian来实现远程过程调用,第二个是通过Hessian提供的二进制RPC协议进行和Servlet进行数据交互,Hessian本身即是基于Http的RPC实现. 案例一: 1.准备工作 这里建立一个Maven项目,其中包含四个模块,父模块(仅用来聚合其它模块,不做实际使用),服务器端模块,客户端模块,API模块(远程过程接口,供服务器和客户端使用).目录结构见下图: 2.添加Hessian的依赖 由于客户端和服务器都要依赖Hessian的包,这里可以添加到父

序列化对象

实现Serialiable 接口才能进行序列化 import java.io.Serializable; class Customer implements Serializable { private String name; private int age; public Customer(String name, int age) { this.name = name; this.age = age; } public String toString() { return "name=&q

DELPHI XE2 采用 JSON 的方式来序列化对象

DELPHI XE2 采用 JSON 的方式来序列化对象 以下代码测试通过.问题是里面的中文,在反序列化后是乱码. 1. 序列化对象为字符串,Subject 里面的中文看起来正常,仍然是中文: 2. 反序列化为对象后,Subject 里面的中文是乱码. XE2 处理 Unicode 还是有问题啊. TItemRecord = class private FID: string; FSubject: string; FADate: TDateTime; published property ID:

c#xml序列化对象,xml标记都缩写了

最近最后一个接口,他们的格式很严格必须是如下格式 <message> <age>20</age> <name>张三</name> </message> 但是我xml序列化对象之后得到的结果如下 <message> <age/> <name></name> </message> 到网上搜索了将近一个半小时也没找到解决方案,最后试想如果给他赋值一个空字符会怎样,结果就如愿解决了上

C# 调用Webservice并传递序列化对象

原文:C# 调用Webservice并传递序列化对象 C#动态调用WebService注意要点 1.动态调用的url后面注意一定要加上?WSDL   例如:string _url = "http://服务器IP:端口/CITI_TRANS_WH/wsTransData_InWH.asmx?WSDL"; ---------------------------------------------------------------------------------------------

使用DataContractJsonSerializer发序列化对象时出现的异常

最近服务器上的某个程序的错误日志中频繁出现以下异常: Deserialising: There was an error deserializing the object of type {type}. The token '"' was expected but found 'Â' 通过分析发现是使用DataContractJsonSerializer发序列化对象时出现的异常 但是把日志中出错的json串拷贝到本机测试时又没有问题,很是费解,最后在网上找到了解决办法 http://stacko