Spring初学者没有上下文可用

时间:2010-06-21 18:32:14

标签: java spring click-framework

我正在尝试使用教程和一些东西来设置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"/>

好的,我尝试在我的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 个答案:

答案 0 :(得分:2)

这听起来与Spring完全无关,因为您的堆栈跟踪显示来自org.apache.click类的异常。

org.test.pages.BasePage做了什么?

我建议将代码简化为简单的输出“Hello World”以测试Spring配置和上下文,然后添加您希望在webapp中使用的其他库。

答案 1 :(得分:2)

这与Spring没有任何关系。您的HomePage类正在调用Click API上的方法,显然不允许这样做。

我建议你不要一石二鸟。一次学习一个框架而不尝试同时学习两个是很困难的,因为你将永远试图弄清楚出了什么问题。

我建议将Spring排除在等式之外,让自己对Click先感到满意。反之亦然。

答案 2 :(得分:2)

点击框架文档suggest以使用scope = "prototype"页面。如果使用基于注释的配置,则为:

@Component @Scope("prototype")

答案 3 :(得分:1)

好像你想要像Spring bean一样处理Click页面,换句话说你希望Spring创建你的Click页面并注入依赖项。 Spring支持两种类型的依赖注入:通过setter方法和构造函数。在上面的示例中,您正在访问Page构造函数中的dao,但是只能在构造页面后注入dao。

我建议你将代码移到Page onInit()方法中。

或者你可以将DAO注入到页面构造函数“IndexPage(CTestDao dao)”中,但我还没有测试它是否有效。

亲切的问候

鲍勃