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