18 agosto, 2021

Solucionar la excepción: JMSException: Failed to build body from content. Serializable class not available to broker

¿Obtienes la siguiente excepción al querer ejecutar tu clase consumidora JMS?

Exception in thread "main" javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker.

Excepción

INFO | Successfully connected to tcp://localhost:61616

Exception in thread "main" javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class java.util.ArrayList! 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.JMSExceptionSupport.create(JMSExceptionSupport.java:36)

at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:213)

at problema03.OConsumer.main(OConsumer.java:50)

Caused by: java.lang.ClassNotFoundException: Forbidden class java.util.ArrayList! 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:115)

at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:56)

at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2028)

at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1895)

at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2202)

at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712)

at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519)

at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477)

at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:211)

... 1 more


Solución

Reemplazar el siguiente código

// Obtiene una conexión JMS del servidor e inicia la comunicación.

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

Connection connection = connectionFactory.createConnection();

connection.start();

por:

// Obtiene una conexión JMS del servidor e inicia la comunicación.

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

connectionFactory.setTrustAllPackages(true);

Connection connection = connectionFactory.createConnection();

connection.start();

Explicación

Como puede ver  “connectionFactory connectionFactory = new ActiveMQConnectionFactory(url);” lo hemosreemplazado por “ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);”

Si lo ejecutamos con el código anterior, al ejecutar nuestra clase Consumer, vamos a obtener la siguiente excepción: “JMSException: Failed to build body from content. Serializable class not available to broker.”. Esto es debido a que la últimas versiones ActiveMQ no permite la transmisión de objetos serializados. Ahora, ActiveMQ obliga al usuario a incluir el paquete en la lista blanca por razones de seguridad. Esto se soluciona incluyendo la propiedad TrustPackages con el nombre del paquete.

El método setTrustedPackages() le permite establecer la lista de paquetes confiables que desea eliminar en serie, como

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");

factory.setTrustedPackages(new ArrayList(Arrays.asList("org.apache.activemq.test,org.apache.camel.test".split(","))));

El método setTrustAllPackages() permite desactivar el control de seguridad y confiar en todas las clases. Es útil para realizar pruebas

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");

factory.setTrustAllPackages(true);

Revise el siguiente enlace: http://activemq.apache.org/objectmessage.html

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!