spring-mvc - Spring JNDI 查找 - 无法将 com.sun.proxy.$Proxy 转换为 EJB 类

标签 spring-mvc jboss ejb jndi wildfly

当我尝试从另一个模块查找 EJB 时,jboss 将返回此异常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.ClassCastException: com.sun.proxy.$Proxy125 cannot be cast to com.foo.spring.logging.UserCategoryLogService
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:927)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:822)
javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:139)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113)
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61)
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240)
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227)
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73)
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146)
io.undertow.server.Connectors.executeRootHandler(Connectors.java:177)
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:722)

到目前为止,查找工作正常,但我根本无法转换对象。 我的项目是一个 Spring-MVC 项目。我连接以接收 UserCategoryLogService 的后端是一个简单的 Java-EE 项目。

我尝试了不同的方式来查找和转换。通常我会这样做:

try {

        UserCategoryLogService logService = (UserCategoryLogService) new InitialContext.lookup("java:jboss/exported/backend/UserCategoryLogServiceImpl!logging.UserCategoryLogService");
        logService.logLogin(username);
    } catch (NamingException e) {
        e.printStackTrace();
    }

当我在后端项目中进行本地 ejb 查找时,通常这是有效的。 我还尝试创建一个属性并在创建新上下文时使用它。它将返回相同的错误。

我将 UserCategoryLogService 接口(interface)添加到 spring-config.xml 中,但没有帮助。

我在spring中没有对JNDI进行额外的配置。 我尝试查找@Local和@Remote,两者都会返回相同的castingException。

我使用的是 Wildfly 8.1.0

您知道如何处理代理对象吗?为什么 ejb-lookup 可以与我的 java-ee 后端一起使用,但不能与我的 spring-mvc 项目一起使用?

spring项目接口(interface):

import javax.ejb.Remote;

@Remote
public interface UserCategoryLogService {
    void logUserCatCall(String userId, Integer categoryId);
    void logLogin(String userId);

}

干杯

编辑2014年9月27日:

我发现了这个问题: Injecting EJB 3 into Spring Bean

所以我尝试 Autowiring bean,但遇到了同样的错误:

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'java:jboss/exported/backend/UserCategoryLogServiceImpl!logging.UserCategoryLogService' must be of type [com.frontend.spring.logging.UserCategoryLogService], but was actually of type [com.sun.proxy.$Proxy105]

编辑2:

 @Bean
    UserCategoryLogService getUserCatLogService() {
        UserCategoryLogService ucLog = null;
        JndiTemplate template = new JndiTemplate();

        try {
            ucLog = (UserCategoryLogService) template.lookup("java:jboss/exported/backend/UserCategoryLogServiceImpl!logging.UserCategoryLogService");
        } catch (NamingException e) {
            e.printStackTrace();
        }


        return ucLog;
    }

也不起作用:

 threw exception; nested exception is java.lang.ClassCastException: com.sun.proxy.$Proxy125 cannot be cast to com.recc.frontend.logging.UserCategoryLogService

最佳答案

我刚刚想出了如何解决这个问题,但我不确定这是否是最好的方法。

您可以使用SimpleRemoteStatelessSessionProxyFactoryBean在Spring中查找远程EJBS。

  SimpleRemoteStatelessSessionProxyFactoryBean fb = new SimpleRemoteStatelessSessionProxyFactoryBean();
            fb.setJndiName(UserCategoryLogService.JNDI_NAME);
            fb.setResourceRef(true);
            fb.setBusinessInterface(UserCategoryLogService.class);
            // Need lifecycle methods
            fb.afterPropertiesSet();
            fb.setJndiTemplate(new JndiTemplate());
            UserCategoryLogService logservice = (UserCategoryLogService) fb.getObject();

这将返回正确的 bean,并且也不需要任何额外的注释或 xml 配置。

赏金仍然有效。如果您发布更好且可行的方法,您将获得 +50 声誉。

编辑:我也在寻找有状态 EJB 的实现,根据名称,这只适用于无状态 EJB。

关于spring-mvc - Spring JNDI 查找 - 无法将 com.sun.proxy.$Proxy 转换为 EJB 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26036789/

相关文章:

jboss - EclipseLink-Moxy 无法在实例化 JAXB 上下文时加载自定义 DomHandler 类

hibernate - JPA 脏检查

java - SessionFactory bean 创建失败(抛出 ClassCastException)

java - @Valid 注解不验证子对象列表

java - 自动构建和部署 Java Web 应用程序

java - JBoss ClassLoading Parent-Last 加载

java - JPA 1.0 和 Hibernate 3.4 在锁定时生成 FOR UPDATE NOWAIT

java - @RunAs 用于@WebService EJB

mysql - 无法在 'com.mysql.jdbc.Driver' 中加载 JDBC 驱动程序类 "intellij idea"

Spring Batch - 未定义名为 'job-configurations' 的 bean