Java Spring初学者没有可用的上下文

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

我正在尝试用教程和一些东西来设置Spring配置。看起来一切正常,但当我用@Resource调用Bean的构造函数时,一切都崩溃了

我也在尝试一箭双雕

请问,有谁能告诉我这里发生了什么,我该如何解决

多谢各位

错误:
原因: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")