[undertow-dev] ClassCastException when retrieving a beans from CDI with Weld Proxy beans
Eric B
ebenzacar at gmail.com
Thu Apr 20 14:04:42 EDT 2017
Indeed, it was an issue with duplicate copies of the class. But I'm still
not convinced I should be getting this error. Is this a parent-first vs
parent-last class loading issue?
The LoginManager.class is part of my ejbs.jar archive.
In my EAR, I had the following
- ejbs.jar
- webapp.war
\- WEB-INF/lib
\- ejbs.jar
I am deploying the with default classloading mechanism (I believe it is
parent-first). But based on the
https://docs.jboss.org/author/display/WFLY10/Class+Loading+in+WildFly, I
seem to understand that the Local Resources (ie: classes within my WAR)
would have a higher dependence than those from the EAR:
In order of highest priority to lowest priority
>
> 1. System Dependencies - These are dependencies that are added to the
> module automatically by the container, including the Java EE api's.
> 2. User Dependencies - These are dependencies that are added through
> jboss-deployment-structure.xml or through the Dependencies: manifest
> entry.
> 3. Local Resource - Class files packaged up inside the deployment
> itself, e.g. class files from WEB-INF/classes or WEB-INF/lib of a war.
> 4. Inter deployment dependencies - These are dependencies on other
> deployments in an ear deployment. This can include classes in an ear's lib
> directory, or classes defined in other ejb jars.
>
>
If that is the case, is my problem that I have the EJB implementation class
in my WAR as well? Is my war only supposed to have a copy of the
LoginManager interface and not the actual impl code as well? Wouldn't that
still cause an issue in that my EJB interface and implementation is in the
root/ejbs.jar and I have an additional copy of the interface in my war?
Thanks,
Eric
On Mon, Apr 17, 2017 at 6:01 PM, Stuart Douglas <sdouglas at redhat.com> wrote:
> It sounds like a class loading problem. You likely have two copies of
> ejbs.LoginManager, and somehow you are using the wrong one. If you
> look at the output of
> System.out.println(LoginManager.class.getClassLoader()) and
> System.out.println(CDI.current().select(clazz).get().
> getClass().getClassLoader())
> it should give you a clue.
>
> This is not an Undertow issue.
>
> Stuart
>
> On Fri, Apr 14, 2017 at 11:52 AM, Eric B <ebenzacar at gmail.com> wrote:
> > I posted this problem on StackOverflow, but after doing more research,
> I'm
> > not sure if this is a Weld, JBoss/WildFly or undertow issue. Or whether
> its
> > a framework issue, or how the framework is being used. If this is not
> the
> > correct list, can you please let me know which list/group I should be
> > directing the issue to?
> >
> > I'm running into a strange problem and error message that I do not
> > understand. I'm running my application on JBoss 7 EAP.
> >
> > Caused by: java.lang.ClassCastException: Cannot cast
> > ejbs.LoginManager$417755913$Proxy$_$$_Weld$EnterpriseProxy$ to
> > ejbs.LoginManager
> >
> > I'm trying to programatically retrieve an EJB from the CDI context by
> using
> > its interface and am getting this error message. I've created a sample
> > proof-of-concept that is trying to retrieve EJB beans from the CDI
> context
> >
> > public <T> T getSesionBean(Class<T> clazz, String name) {
> > Properties properties = new Properties();
> >
> > try {
> > InitialContext initContext = new InitialContext();
> >
> > return clazz.cast(CDI.current().select(clazz).get());
> > } catch (Exception e) {
> > // TODO Auto-generated catch block
> > throw new RuntimeException(e);
> > }
> > }
> >
> > It is being called as:
> >
> > LoginManager login = getSesionBean(LoginManager.class);
> >
> > with my EJB defined as:
> >
> > @Stateless(name="LoginManager")
> > @Local(LoginManager.class)
> > @LocalBinding(jndiBinding="LoginManager")
> > public class LoginManagerBean implements LoginManager {
> > ...
> > ...
> > ...
> > }
> >
> > I don't understand it. I'm expecting the bean being retrieved from the
> > context to be a proxy. Shouldn't it be castable to my interface?
> Otherwise,
> > how am I supposed to retrieve it?
> >
> > More interestingly, this does not seem to be a consistent error;
> sometimes
> > the code works fine. Sometimes it fails. I haven't been able to determine
> > what makes it work or throw an exception.
> >
> > I found a related issue here, but not sure if this is the same problem
> > and/or which version of Weld is used in JB7EAP. I'm including the
> following
> > dependency in my application:
> >
> > <dependency>
> > <groupId>org.wildfly</groupId>
> > <artifactId>wildfly-ejb-client-bom</artifactId>
> > <version>10.1.0.Final</version>
> > <type>pom</type>
> > </dependency>
> >
> > Am I doing something completely wrong? If this is a Weld bug, can I use a
> > different proxy system than Weld? Is this even configurable in undertow?
> >
> >
> > Thanks,
> >
> >
> > Eric
> >
> >
> > _______________________________________________
> > undertow-dev mailing list
> > undertow-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/undertow-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170420/3298e2dc/attachment.html
More information about the undertow-dev
mailing list