关于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關于這個錯誤,其實在報錯的提示里面已經(jīng)給出了官方的解決方案的地址,即:http://activemq.apache.org/objectmessage.html
出現(xiàn)這個問題的原因在于:從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”參數(shù):
<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”參數(shù),在這行參數(shù)后面添加如下的配置:
-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,cn.zifangsky.activemq,cn.zifangsky.model但是經(jīng)過嘗試我發(fā)現(xiàn)并沒有效果,其實僅僅只是修改“ActiveMQ 的連接工廠”那段配置就可以解決這個問題了
最后測試效果如下:
@Testpublic?void?testObject(){User?u?=?new?User((long)?1,"test","123456");queueSender2.send("object.queue",?u);}運行這個方法之后,輸出如下:
接收到消息:?User?[id=1,?username=test,?password=123456]可以發(fā)現(xiàn),問題成功解決了
轉(zhuǎn)載于:https://blog.51cto.com/983836259/1877600
總結(jié)
以上是生活随笔為你收集整理的关于ActiveMQ序列化对象爆“Forbidden class xxx! ...”问题的解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC图片上传与显示
- 下一篇: 将Centos的yum源更换为阿里云源