Java Spring初学者没有可用的上下文
我正在尝试用教程和一些东西来设置Spring配置。看起来一切正常,但当我用@Resource调用Bean的构造函数时,一切都崩溃了 我也在尝试一箭双雕 请问,有谁能告诉我这里发生了什么,我该如何解决 多谢各位 错误:Java Spring初学者没有可用的上下文,java,spring,click-framework,Java,Spring,Click Framework,我正在尝试用教程和一些东西来设置Spring配置。看起来一切正常,但当我用@Resource调用Bean的构造函数时,一切都崩溃了 我也在尝试一箭双雕 请问,有谁能告诉我这里发生了什么,我该如何解决 多谢各位 错误: 原因:java.lang.RuntimeException:ThreadLocal上下文堆栈上没有可用的上下文 在org.apache.click.Context$ContextStack.peek上(Context.java:934) 在org.apache.click.Cont
原因:java.lang.RuntimeException:ThreadLocal上下文堆栈上没有可用的上下文
在org.apache.click.Context$ContextStack.peek上(Context.java:934)
在org.apache.click.Context$ContextStack.access$000(Context.java:885)
在org.apache.click.Context.getThreadLocalContext(Context.java:168)上
在org.apache.click.extras.control.MenuFactory.loadFromMenuXml(MenuFactory.java:495)上
在org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:302)上
在org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:255)上
在org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:197)上
在org.test.pages.BasePage上(BasePage.java:15)
在org.test.pages.HomePage.(HomePage.java:24)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:126)
... 30多
这是我的applicationContext.xml:
这是我的web.xml:
CTest
org.springframework.web.context.ContextLoaderListener
ClickServlet
org.apache.click.extras.spring.SpringClickServlet
0
ClickServlet
*.htm
index.htm
编辑:我按照建议更改了代码,但我的dao仍然为空。 在appContext中,我还提出:
好的,我试图将我的Dao注入到我的IndexPage中,但在构造函数中cTestDao为null。我做错了什么 谢谢 IndexPage类别代码:
@Component@Scope(“原型”)
公共类IndexPage扩展页面{
@资源
受保护的CTestDao CTestDao;
公共索引扩展(){
超级();
List List=cTestDao.getBeans(Employee.class);
对于(员工e:列表){
String s=String.format(“姓名:%1姓氏:%2薪资%3欧元”,e.getFirstName(),e.getLastName(),e.getSalary());
系统输出打印项次;
}
}
}
这听起来与Spring完全无关,因为stacktrace显示了来自org.apache的异常。单击classes
org.test.pages.BasePage
做什么
我建议将您的代码精简为一些简单的东西,比如输出“Hello World”来测试Spring配置和上下文,然后添加您希望在webapp中使用的其他库。这听起来与Spring完全无关,因为stacktrace显示了来自org.apache的异常。单击类
org.test.pages.BasePage
做什么
我建议您将代码精简为一些简单的东西,比如输出“Hello World”来测试Spring配置和上下文,然后添加您希望在webapp中使用的其他库。这与Spring没有任何关系。您的主页
类正在调用Click API上的方法,这显然是不允许的
我建议你不要一箭双雕。一次学习一个框架而不同时学习两个框架已经够难的了,因为你将永远试图找出哪里出了问题
我建议把Spring从等式中去掉,先让自己适应Click。反之亦然。这与Spring没有任何关系。您的主页
类正在调用Click API上的方法,这显然是不允许的
我建议你不要一箭双雕。一次学习一个框架而不同时学习两个框架已经够难的了,因为你将永远试图找出哪里出了问题
我建议把Spring从等式中去掉,先让自己适应Click。反之亦然。单击框架文档以使用scope=“prototype”
页面。如果使用基于注释的配置,它将是:
@Component @Scope("prototype")
单击框架文档以使用页面的scope=“prototype”
。如果使用基于注释的配置,它将是:
@Component @Scope("prototype")
似乎您希望像Springbean一样对待单击页面,换句话说,您希望Spring创建您的单击页面并注入依赖项。Spring支持两种类型的依赖项注入:通过setter方法和构造函数。在上面的示例中,您正在访问页面构造函数中的dao,但dao只能在构建页面后注入
我建议您将代码移到Page onInit()方法中
或者,您可以将DAO注入页面构造函数“IndexPage(CTestDao-DAO)”,但我还没有测试这是否有效
问候
Bob似乎您希望将单击页面视为Springbean,换句话说,您希望Spring创建单击页面并注入依赖项。Spring支持两种类型的依赖项注入:通过setter方法和构造函数。在上面的示例中,您正在访问页面构造函数中的dao,但dao只能在构建页面后注入
我建议您将代码移到Page onInit()方法中
或者,您可以将DAO注入页面构造函数“IndexPage(CTestDao-DAO)”,但我还没有测试这是否有效
问候
鲍勃是的
<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>
@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);
}
}
}
@Component @Scope("prototype")