1

チュートリアルなどでSpring構成をセットアップしようとしています。すべて問題ないようですが、 @Resource を使用して Bean のコンストラクターを呼び出すと、すべてが失敗します。

また、一石二鳥の Apache Click にも挑戦しています。

ここで何が起こっているのか、どうすれば修正できるのか、誰か教えてください。

ありがとうございました。

エラー:

Caused by: java.lang.RuntimeException: No Context available on ThreadLocal Context Stack
at org.apache.click.Context$ContextStack.peek(Context.java:934)
at org.apache.click.Context$ContextStack.access$000(Context.java:885)
at org.apache.click.Context.getThreadLocalContext(Context.java:168)
at org.apache.click.extras.control.MenuFactory.loadFromMenuXml(MenuFactory.java:495)
at org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:302)
at org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:255)
at org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:197)
at org.test.pages.BasePage.<init>(BasePage.java:15)
at org.test.pages.HomePage.<init>(HomePage.java:24)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
... 30 more

これは私のapplicationContext.xmlです:

<context:annotation-config />

<context:component-scan base-package="org.test" />
<tx:annotation-driven />

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.10:1521:xe" />
    <property name="user" value="HR" />
    <property name="password" value="hr"/>

</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="ctest" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="showSql" value="true" />
        </bean>
    </property>

</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

これは私のweb.xmlです:

    <display-name>CTest</display-name>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>ClickServlet</servlet-name>
    <servlet-class>org.apache.click.extras.spring.SpringClickServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ClickServlet</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.htm</welcome-file>
</welcome-file-list>


編集: 提案どおりにコードを変更しましたが、私の dao はまだ null です。また、私が入れたappContextで:

<context:component-scan base-package="org.test.pages" scope-resolver="org.apache.click.extras.spring.PageScopeResolver"/>

OK、IndexPage に Dao を注入しようとしましたが、コンストラクター cTestDao が null です。
私は何を間違っていますか?

ありがとう

IndexPage クラス コード:

@Component @Scope("prototype")
public class IndexPage extends Page {

    @Resource
    protected CTestDao<Employee> cTestDao;

 public IndexPage(){
     super();
     List<Employee> list = cTestDao.getBeans(Employee.class);
     for(Employee e:list){
      String s = String.format("Name:%1 Last Name:%2 Salary%3€",e.getFirstName(),e.getLastName(),e.getSalary());
      System.out.println(s);
     }
 }
}
4

4 に答える 4

2

フレームワークのドキュメントをクリックして、ページに使用することを提案scope = "prototype"します。注釈ベースの構成を使用する場合は、次のようになります。

@Component @Scope("prototype")
于 2010-06-21T19:29:30.090 に答える
2

org.apache.clickスタックトレースがクラスからの例外を示しているため、これはSpringとはまったく関係ないように思えます 。

何をしorg.test.pages.BasePageますか?

「Hello World」を出力して Spring の構成とコンテキストをテストし、Web アプリケーションで使用する他のライブラリを追加するなど、コードを単純なものに切り詰めることをお勧めします。

于 2010-06-21T18:42:19.693 に答える
2

これはSpringとはまったく関係ありません。あなたのHomePageクラスは、明らかに許可されていない Click API のメソッドを呼び出しています。

一石二鳥ではないことをお勧めします。同時に2 つのフレームワークを学ぼうとせずに、一度に 1 つのフレームワークを学習するのは十分に困難です。

方程式から Spring を取り除き、まず Click に慣れることをお勧めします。またはその逆。

于 2010-06-21T18:42:53.577 に答える
1

ClickページをSpringBeanのように扱いたいように見えます。つまり、SpringにClickページを作成して依存関係を注入させたいようです。Springは、setterメソッドとコンストラクターの2種類の依存性注入をサポートしています。上記の例では、Pageコンストラクターでdaoにアクセスしていますが、daoは、ページが作成された後にのみ注入できます。

コードをPageonInit()メソッドに移動することをお勧めします。

または、DAOをページコンストラクター「IndexPage(CTestDao dao)」に挿入することもできますが、それが機能するかどうかはテストしていません。

敬具

ボブ

于 2010-06-22T05:51:27.743 に答える