2012-05-28 4 views
0

응용 프로그램에서 JNDI bean을 만들려고하지만 "리소스 인스턴스를 만들 수 없음"오류가 첫 번째 코드 블록의 세 번째 줄에서 발생합니다. 나는 http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html과 같은 단계를 따르고 있습니다.JNDI Java Bean 만들기 오류

콩 인스턴스화 :

  Context initCtx = new InitialContext(); 
      Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
      MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); 

      System.out.println("foo = " + bean.getFoo() + ", bar = " + 
          bean.getBar()); 

클래스에서 myBean : 여기

는 코드를 간다

package com.company.intrasc.funcionarios; 
public class MyBean { 
    private String foo = "Default Foo"; 

    public String getFoo() { 
    return (this.foo); 
    } 

    public void setFoo(String foo) { 
    this.foo = foo; 
    } 

    private int bar = 0; 

    public int getBar() { 
    return (this.bar); 
    } 

    public void setBar(int bar) { 
    this.bar = bar; 
    } 

} 

클래스 MyBeanFactory :

package com.company.intrasc.factory; 

import java.util.Enumeration; 
import java.util.Hashtable; 
import javax.naming.Context; 
import javax.naming.Name; 
import javax.naming.NamingException; 
import javax.naming.RefAddr; 
import javax.naming.Reference; 
import javax.naming.spi.ObjectFactory; 
import com.company.intrasc.funcionarios.MyBean; 

public class MyBeanFactory implements ObjectFactory { 

    public Object getObjectInstance(Object obj, 
     Name name, Context nameCtx, Hashtable environment) 
     throws NamingException { 

     // Acquire an instance of our specified bean class 
     MyBean bean = new MyBean(); 

     // Customize the bean properties from our attributes 
     Reference ref = (Reference) obj; 
     Enumeration addrs = ref.getAll(); 
     while (addrs.hasMoreElements()) { 
      RefAddr addr = (RefAddr) addrs.nextElement(); 
      String name1 = addr.getType(); 
      String value = (String) addr.getContent(); 
      if (name1.equals("foo")) { 
       bean.setFoo(value); 
      } else if (name1.equals("bar")) { 
       try { 
        bean.setBar(Integer.parseInt(value)); 
       } catch (NumberFormatException e) { 
        throw new NamingException("Invalid 'bar' value " + value); 
       } 
      } 
     } 

     // Return the customized instance 
     return (bean); 

    } 

} 

응용 프로그램 폴더에서 web.xml을 :

<resource-env-ref> 
    <description>Object factory for MyBean instances.</description> 
    <resource-env-ref-name>bean/MyBeanFactory</resource-env-ref-name> 
    <resource-env-ref-type>com.company.intrasc.funcionarios.MyBean</resource-env-ref-type> 
</resource-env-ref> 

server.xml의 컨텍스트 구성 :

<Resource name="bean/MyBeanFactory" auth="Container" type="com.company.intrasc.funcionarios.MyBean" factory="com.company.intrasc.factory.MyBeanFactory" bar="23"/> 

스택 트레이스 :

javax.naming.NamingException: Cannot create resource instance 
    at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:114) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:793) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:140) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:781) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153) 
    at com.company.intrasc.servlet.Logon.executa(Logon.java:81) 
    at com.company.intrasc.servlet.Controller.service(Controller.java:80) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 

클래스에서 myBean MyBeanFactory 및 압축 된 항아리 CATALINA_HOME/LIB로 수출된다. 서버가 Tomcat 6이고 IDE가 Eclipse Indigo이고 시스템 (개발 시스템에서)은 Windows Vista입니다. 무엇이 잘못 될까요?

+0

"작동하지 않음"을 정의하십시오. 예외? 아무것도? 다른 것? –

+0

@JimGarrison, 죄송합니다. 매우 일반적인 이유 인 "리소스 인스턴스를 만들 수 없습니다."라는 오류로 질문을 업데이트했습니다. 첫 번째 코드 블록의 세 번째 줄에 나타납니다. – Alex

+0

모든 "원인"섹션을 포함하여 ** 전체 ** 스택 추적을 게시하십시오. –

답변

1

마지막으로 문제를 발견했습니다. 아무에게도 유용 할 지 모르겠지만 server.xml의 <context> 태그에 문제가 있습니다. 이 태그는 내가 잊어 버렸던 <Resource> 태그를 이해해야합니다. 따라서 컨텍스트는 리소스를 "보지 못했습니다."