JBOSS 가 ejb 를 개발 하 다가 벽 에 부 딪 혔 어 요.
제 JBoss 서버 는 D: \ jboss 420 GA 디 렉 터 리 에 설치 되 어 있 습 니 다.
Entity Bean 이 Oracle 을 비 추 는 Table 을 개발 하기 위해 저 는 OracleDS 데이터 원본 을 설정 합 니 다.
1. D: \ \ jboss 420 GA \ \ docs \ examples \ jca 에서 설정 파일 Oacle - ds. xml 을 D: \ jboss 420 GA \ \ server \ \ default \ deploy 로 복사 합 니 다.
2. Oacle - ds. xml 의 내용 을 편집 합 니 다.
3. Oracle 의 JDBC 드라이버 ojdbc 14. jar 또는 classes 12. jar 를 D: \ jboss 420 GA \ \ server \ default \ lib 폴 더 에 복사 합 니 다.
4. Netbeans IDE 에서 "실행 환경" 보 기 를 활성화 하고 "서버" - "JBoss Application Server" 를 선택 하여 시작 합 니 다.시작 과정 에서 NetbeansIDE 의 출력 창 은 다음 과 같은 내용 을 보 여 줍 니 다.
14:28:21,328 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=OracleDS' to JNDI name 'java:OracleDS' 14:28:21,406 INFO [TomcatDeployer] deploy, ctxPath=/jmx-console, warUrl=.../deploy/jmx-console.war/ 14:28:21,953 INFO [EARDeployer] Init J2EE application: file:/K:/J2ee/jboss-4.2.0.GA/server/default/deploy/EJB3Leaning.ear ......
굵 은 글자 의 내용 을 주의 하 십시오. 데이터 원본 설정 파일 에 문제 가 없다 는 것 을 설명 합 니 다.
5. Servlet 테스트 데이터 원본 이 올 바른 지 작성: 새 웹 프로젝트 를 만 들 고 테스트 데이터 원본 의 Servlet 를 만 듭 니 다. 그 내용 은 다음 과 같 습 니 다.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); DataSource ds; try { ds = getOracleDS(); Connection conn=ds.getConnection(); Statement sta=conn.createStatement(); ResultSet rs= sta.executeQuery("select * from Employee"); while ( rs.next() ) { out.println(rs.getString(2)+"<br>"); } rs.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } out.close(); } private DataSource getOracleDS() throws NamingException { Context c = new InitialContext(); return (DataSource) c.lookup("java:comp/env/OracleDS"); }
이 Servlet 을 실행 하고 호출 합 니 다. 페이지 에 Employee 표 에 있 는 모든 직원 의 이름 이 성공 적 으로 표시 되 었 습 니 다.
데이터 원본 설정 이 정확 하 다 는 것 을 설명 합 니 다.
6. '기업 응용 프로그램' 프로젝트 를 만 들 고 EJB 모듈 에서 '데이터 베 이 스 를 통 해 실체 클래스 만 들 기' 마법 사 를 이용 하여 OracleDS 데이터 원본 을 선택 하고 Employee 표 와 그 관련 표 에 비 친 실체 클래스 를 만 들 며 지구 화 유닛 을 동시에 만 듭 니 다.지구 화 단위 정의 파일 persistence. xml 내용 은 다음 과 같 습 니 다.
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="testEJB-ejbPU" transaction-type="JTA"> <jta-data-source>OracleDS</jta-data-source> <properties/> </persistence-unit> </persistence>
7. 배치 EJB: 프로젝트 이름 에서 오른쪽 단 추 를 누 르 고 '배치 프로젝트' 메뉴 항목 을 선택 합 니 다.JBoss 서버 의 출력 정 보 를 주의 깊 게 관찰 하 세 요.다음 과 같은 오류 정보 가 발견 되 었 습 니 다.
15:04:55,437 INFO [PersistenceUnitDeployment] Starting persistence unit persistence.units:ear=testEJB.ear,unitName=testEJB-ejbPU 15:04:55,718 WARN [ServiceController] Problem starting service persistence.units:ear=testEJB.ear,unitName=testEJB-ejbPU javax.naming.NameNotFoundException: OracleDS not bound at org.jnp.server.NamingServer.getBinding(NamingServer.java:529) at org.jnp.server.NamingServer.getBinding(NamingServer.java:537) at org.jnp.server.NamingServer.getObject(NamingServer.java:543) at org.jnp.server.NamingServer.lookup(NamingServer.java:296) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625) ......
데이터 원본 설정 은 괜 찮 지만 EJB 를 발표 할 때 데이터 원본 바 인 딩 오 류 를 보고 합 니 다.
왜?!
이 문 제 는 며칠 동안 나 를 괴 롭 혔 고, 마침내 위 키 제 이 보스 에서 답 을 찾 았 다.데이터 원본 프로필 Oacle - ds. xml 에 자바 컨 텍스트 를 사용 하지 않 는 옵션 을 추가 해 야 합 니 다.
<use-java-context>false</use-java-context>
WikiJBoss 의 원문 발췌 문 은 다음 과 같다.
<use-java-context> - A boolean indicating if the jndi-name should be prefixed with java: which causes the DataSource to only be accessible from within the jboss server vm. The default is true. Configuring a DataSource for remote usage As of jboss-4.0.0 there is support for accessing a DataSource from a remote client. The one change that is necessary for the client to be able to lookup the DataSource from JNDI is to specify use-java-context=false as shown here: <datasources> <local-tx-datasource> <jndi-name>GenericDS</jndi-name> <use-java-context>false</use-java-context> <connection-url>...</connection-url> ... This results in the DataSource being bound under the JNDI name "GenericDS" instead of the default of "java:/GenericDS" which restricts the lookup to the same VM as the jboss server.
따라서 이 수정 을 한 후에 앞에서 데이터 원본 설정 이 올 바른 Servlet 인지 테스트 하려 면 다음 과 같이 적절하게 수정 해 야 합 니 다.
private DataSource getOracleDS() throws NamingException { Context c = new InitialContext(); return (DataSource) c.lookup("OracleDS"); } , 。 8、 Bean: NetbeansIDE “ Bean” , Emp Bean, , JBoss , 。 9、 Servlet, Bean:Servlet : protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); EmpFacadeRemote dao=lookupEmpFacade(); List l=dao.findAll(); for (int i=0; i<l.size(); i++){ Emp e=(Emp)l.get(i); out.println(e.getEname()+"<br>"); } out.close(); } private EmpFacadeRemote lookupEmpFacade() { try { Context c = new InitialContext(); return (EmpFacadeRemote) c.lookup("java:comp/env/ejb/EmpFacade"); } catch(NamingException ne) { Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught" ,ne); throw new RuntimeException(ne); } }
그리고 프로젝트 를 배치 하고 프로젝트 를 실행 합 니 다. Servlet 이 호출 되 었 을 때 오류 가 발생 했 습 니 다. type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception java.lang.RuntimeException: javax.naming.NameNotFoundException: ejb not bound com.pqf.servlet.ListEmp.lookupEmpFacade(ListEmp.java:81) com.pqf.servlet.ListEmp.processRequest(ListEmp.java:38) com.pqf.servlet.ListEmp.doPost(ListEmp.java:64) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) root cause javax.naming.NameNotFoundException: ejb not bound org.jnp.server.NamingServer.getBinding(NamingServer.java:529) org.jnp.server.NamingServer.getBinding(NamingServer.java:537) org.jnp.server.NamingServer.getObject(NamingServer.java:543) org.jnp.server.NamingServer.lookup(NamingServer.java:267) org.jnp.server.NamingServer.lookup(NamingServer.java:270) org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625) org.jnp.interfaces.NamingContext.lookup(NamingContext.java:716) org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587) javax.naming.InitialContext.lookup(InitialContext.java:392) com.pqf.servlet.ListEmp.lookupEmpFacade(ListEmp.java:77) com.pqf.servlet.ListEmp.processRequest(ListEmp.java:38) com.pqf.servlet.ListEmp.doPost(ListEmp.java:64) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
또 왜?
(끝)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.