-1

アプリケーションでJNDIBeanを作成しようとしていますが、その下の最初のコードブロックの3行目に「リソースインスタンスを作成できません」というエラーが発生します。http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.htmlに示されている手順に従っています。

コードは次のとおりです。

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は、圧縮されたJARのcatalina_home/libにエクスポートされます。サーバーはTomcat6、IDEはEclipse Indigo、システム(開発マシン内)はWindowsVistaです。何がうまくいかないのですか?

4

1 に答える 1

0

最後に、問題を発見しました。誰の役に立つかわかりませんが、<context>server.xml のタグに問題がありました。このタグは、入れ忘れて<Resource>いたタグを理解する必要があります。したがって、コンテキストはリソースを「認識」していませんでした。

于 2012-05-30T19:16:31.870 に答える