0

I have an Spring Controller with a EJB injected. I can inject this EJB using spring proxy:

   <jee:local-slsb id="procedimentRepositoryBean"
                jndi-name="java:global/sedeib/sedeib-ejb/ProcedimentServiceFacade"
                business-interface="es.caib.sedeib.service.facade.ProcedimentServiceFacade"/>

Both uses the same DTO, and when the EJB (procedimentServiceFacade) returns a filled DTO the spring controller try to Cast the DTO to the same DTO. It throws a ClassCastException:

@Controller
@RequestMapping("/prova/")
public class TestController {

@Autowired
private ProcedimentServiceFacade procedimentServiceFacade; //EJB Proxy INJECTION


@RequestMapping(value = "test", method = RequestMethod.GET)
@ResponseBody
public ProcedimentDTO test(){
    ProcedimentDTO dto = procedimentServiceFacade.findById(1L).orElse(new ProcedimentDTO());
    return dto;
}

}

Stack trace:

Caused by: java.lang.ClassCastException: class es.caib.sedeib.service.model.ProcedimentDTO cannot be cast to class es.caib.sedeib.service.model.ProcedimentDTO (es.caib.sedeib.service.model.ProcedimentDTO is in unnamed module of loader 'deployment.sedeib.ear' @4fd1ef7f; es.caib.sedeib.service.model.ProcedimentDTO is in unnamed module of loader 'deployment.sedeib.ear.sedeib-back.war' @33adbd6e)
at deployment.sedeib.ear.sedeib-back.war//es.caib.sedeib.back.controller.TestController.test(TestController.java:23)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at deployment.sedeib.ear.sedeib-back.war//org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:181)
at deployment.sedeib.ear.sedeib-back.war//org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at deployment.sedeib.ear.sedeib-back.war//org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at deployment.sedeib.ear.sedeib-back.war//org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at deployment.sedeib.ear.sedeib-back.war//org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at deployment.sedeib.ear.sedeib-back.war//org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
... 52 more

I read here that it could happen because the spring beans and the EJB are loaded by diferents class loaders. In old Jboss versions, this is solutioned by fixing a class loader with this config:

<class-loading>
    <loader-repository>
        some-name:loader=name
        <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
    </loader-repository>
</class-loading>

But it seems deprecated for Jboss7. Are there any way for have the same class loader on both contexts (spring and EJB) ?

Environment:

  • OpenJdk11
  • Jboss7.2
  • EJB3
  • Spring 4.3.19
Xavi Torrens
  • 337
  • 1
  • 12

0 Answers0