Spring Bean和EJB 3之间的类强制转换异常-Jboss 7

pdkcd3nj  于 2023-02-03  发布在  Spring
关注(0)|答案(1)|浏览(112)

我有一个注入了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
pw136qt2

pw136qt21#

当您尝试将一种类型的示例强制转换为另一种类型,但它们不兼容时,JBoss 7中的Spring Bean和EJB3之间会发生ClassCastException。如果Spring Bean和EJB3 Bean使用的不是同一个类,或者所使用的类的版本之间不匹配,则会发生这种情况。要解决此问题,请确保使用正确的类。并且Springbean和EJB3bean使用的是相同版本的类。另外,考虑在两个bean之间使用公共接口以避免类不匹配。

相关问题