我正在尝试使用教程和一些东西来设置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
<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>
<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。
我做错了什么?
由于
@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);
}
}
}
答案 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)”中,但我还没有测试它是否有效。
亲切的问候
鲍勃