RockmanJoe
RockmanJoe

Reputation: 1658

Why does my JBoss module throw a ClassCastException?

Hi StackOverflow Community,

I have a WAR which I have deployed to a JBoss Wildfly 8.2 instance. Also in Wildfly, I have created two modules:

  1. a third party JMS JCA adapter module,
  2. and a model module (model.jar) that contains message classes used to communicate between the JMS broker and the WAR

The WAR has a jboss-deployment-structure.xml that declares a dependency on the JCA module:

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <dependencies>
            <module name="com.thirdparty.mq.ra" slot="main"/>
            <module name="com.company.model" slot="main">
        </dependencies>
    </deployment>
</jboss-deployment-structure>

The WAR has the model.jar file packaged in its WEB-INF/lib folder.

The JMS module has a dependency on the model module:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="com.thirdparty.mq.ra">
    <resources>
        <resource-root path="."/>
        <resource-root path="thirdparty-jms-provider.jar"/>
        ...
        <resource-root path="thirdparty-lib.jar"/>
    </resources>
    <dependencies>
        <module name="com.company.model"/>
        <module name="javax.api"/>
        <module name="javax.jms.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.management.j2ee.api"/>  
        <module name="javax.resource.api"/>
        <module name="org.jboss.invocation"/>
        <module name="org.jboss.remote-naming" optional="true"/>
        <module name="org.slf4j"/>
    </dependencies>
</module>

When running, I get the following exception:

Caused by: java.lang.ClassCastException: com.company.model.web.dto.WebAuthenticationResponse cannot be cast to com.company.model.web.dto.WebAuthenticationResponse

I suspect it is a classloader issue. Is there some extra information I have to specify in the module.xml or jboss-deployment-structure.xml files?

Thanks for your help!

Upvotes: 1

Views: 1307

Answers (1)

Harald Wellmann
Harald Wellmann

Reputation: 12855

Assuming that your model.jar corresponds to your com.company.model module, your WAR classloader now sees the model classes twice, both from its own libraries in WEB-INF/lib and via the module dependency.

You should either import or embed a module/library, but not both.

By the way, importing a RAR module looks a bit suspicious. You should never depend on the implementation of a resource adapter. Maybe you can factor out an API module and import that.

Upvotes: 2

Related Questions