EJB 로컬 호출 해결 "java.lang.ClassCastException: $Proxy96 cannot be cannot be cast to com.tgb.ejb.UserManager"이상
웹 클라이언트가 로컬로 호출할 때 EJB 서버가 포장한jar를 인용해야 하며, JBoss/client의jar와 src의 jndi를 인용할 필요가 없습니다.properties 파일, 호출 방법은 다음과 같습니다.
<%@ page language="java"
import="java.util.*,javax.naming.*,com.tgb.ejb.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<%
InitialContext ctx = new InitialContext();
UserManager usermanager = (UserManager) ctx
.lookup("UserManagerBean/local");
User user = new User();
user.setUsername("quwenzhe");
user.setPassword("quwenzhe123");
usermanager.addUser(user);
out.println("userId=" + user.getId());
%>
</body>
</html>
브라우저에서 클라이언트가 게시한 URL 주소를 입력하면 JBoss는 다음과 같은 예외를 보고합니다.
13:02:30,924 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: $Proxy96 cannot be cast to com.tgb.ejb.UserManager
at org.apache.jsp.index_jsp._jspService(index_jsp.java:79)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
at java.lang.Thread.run(Thread.java:619)
해결 방안은 JBoss 서버의 jboss-4.2.3입니다.GA\server\default\deploy\jboss-web.deployer\META-INF 경로에서 jboss-service를 찾습니다.xml 파일,
UseJBossWebLoader 속성은true로 설정됩니다. Tomcat은 JBoss의 통일된 클래스 캐리어를 웹 응용 프로그램의 클래스 캐리어로 사용합니다. 이것은 WAR 패키지의 WEB-INF/classes와 WEB-INF/lib 디렉터리의 클래스가 부족한 공유 클래스 캐리어 창고에 불러온다는 것을 의미합니다.이를 통해 클래스와 자원을 웹 응용 프로그램 간에 공유할 수 있다.단, 만약 이것이 당신이 원하는 상황이 아니라면, 이 속성을false로 설정하여 이러한 행위를 피할 수 있습니다.일반적인 상황에서 이런 상황을 피해야 한다. 왜냐하면 서로 다른 응용 프로그램에서 같은 종류와 자원을 가지고 있을 때 JBoss의 서로 다른 응용 프로그램 사이에 충돌이 발생하기 때문이다.예를 들면 다음과 같다. 두 개의 War 응용 프로그램은 WarA, WarB 아래에 모두com이 있다.tgb.User.class 파일;이제 각 War 패키지 아래에 각각의 User를 사용하기를 기대합니다.class 파일, WarA 응용 프로그램을 수정할 때tomcat은 다음 응용 프로그램을 재배치합니다.이때 WarA 앱이 WarB 아래의 사용자를 사용합니다.class, 혼란을 초래하다.
나의 설명이 모두의 진보를 도울 수 있기를 바란다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.