我有一个注入了EJB的Spring控制器。我可以使用Spring代理注入这个EJB:
<jee:local-slsb id="procedimentRepositoryBean"
jndi-name="java:global/sedeib/sedeib-ejb/ProcedimentServiceFacade"
business-interface="es.caib.sedeib.service.facade.ProcedimentServiceFacade"/>
两者都使用相同的DTO,当EJB(procedimentServiceFacade)返回一个填充的DTO时,spring控制器尝试将DTO转换为相同的DTO。
@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;
}
}
堆栈跟踪:
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
我在here上看到,这可能是因为spring bean和EJB是由diferents类加载器加载的,在旧的Jboss版本中,这是通过使用以下配置修复类加载器来解决的:
<class-loading>
<loader-repository>
some-name:loader=name
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</class-loading>
但是对于Jboss7来说,它似乎已经过时了。有没有办法在两个上下文(spring和EJB)上使用相同的类加载器?
环境:
- 打开Jdk11
- 接头7.2
- EJB3
- Spring4.3.19
1条答案
按热度按时间pw136qt21#
当您尝试将一种类型的示例强制转换为另一种类型,但它们不兼容时,JBoss 7中的Spring Bean和EJB3之间会发生ClassCastException。如果Spring Bean和EJB3 Bean使用的不是同一个类,或者所使用的类的版本之间不匹配,则会发生这种情况。要解决此问题,请确保使用正确的类。并且Springbean和EJB3bean使用的是相同版本的类。另外,考虑在两个bean之间使用公共接口以避免类不匹配。