如何让 Spring 与 Wicket 配合良好? (ContextLoaderListener问题)
据我所知,根据我找到的说明(例如 this 和 ),我需要在 web.xml 中使用这个才能让 Spring 工作:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
="http://www.mkyong.com/wicket/wicket-spring-integration-example/" rel="nofollow">这也是 我的 Wicket 应用程序类,我有:
public class MyApplication extends WebApplication {
@Override
protected void init() {
super.init();
addComponentInstantiationListener(new SpringComponentInjector(this));
}
@Override
public Class<? extends Page> getHomePage() {
return HelloWorldPage.class;
}
}
问题是,每当我在 web.xml 中有 ContextLoaderListener 时,Wicket 就不会启动。我只是收到 404 错误(或空白页),控制台输出如下:
SEVERE: Error listenerStart
Jun 28, 2011 12:49:04 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [1,973] milliseconds.
Jun 28, 2011 12:49:04 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [] startup failed due to previous errors
Jun 28, 2011 12:49:04 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [] registered the JDBC driver [org.hsqldb.jdbc.JDBCDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Jun 28, 2011 12:49:04 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Jun 28, 2011 12:49:04 PM org.apache.catalina.startup.HostConfig deployDirectory
我正在使用两个框架的最新版本(Wicket 1.4.17 和 Spring 3.0.5),以及运行它们的 Tomcat 7(Tomcat 6 也会发生同样的情况)。另外,我在 WEB-INF/lib 中有以下 jar。缺少什么或太多?
antlr-2.7.6.jar log4j-1.2.16.jar spring-web-3.0.5.jar
commons-collections-3.1.jar mysql-connector-5.1.10.jar slf4j-api-1.6.1.jar
dom4j-1.6.1.jar spring-beans-3.0.5.jar slf4j-log4j12-1.6.1.jar
guava-r09.jar spring-context-3.0.5.jar wicket-1.4.17.jar
hibernate-3.6.5.jar spring-core-3.0.5.jar wicket-auth-roles-1.4.17.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar spring-jdbc-3.0.5.jar wicket-datetime-1.4.17.jar
hsqldb.jar spring-orm-3.0.5.jar wicket-ioc-1.4.17.jar
javassist-3.12.0.GA.jar spring-test-3.0.5.jar wicket-spring-1.4.17.jar
jta-1.1.jar spring-transaction-3.0.5.jar wicketstuff-annotation-1.4.17.2.jar
web.xml 的其余部分(我尝试使用 servlet 和过滤器设置 Wicket;没有区别):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>My App</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>configuration</param-name>
<param-value>development</param-value>
</context-param>
<filter>
<filter-name>MyApp</filter-name>
<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
<init-param>
<param-name>applicationClassName</param-name>
<param-value>com.acme.MyApplication</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyApp</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
谷歌搜索我发现 有人遇到同样的问题,但没有解决方案。
有趣的是,我之前已经让 Spring 和 Wicket 很好地协同工作,并且设置几乎相同。有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是我的项目的配置:
希望这会有所帮助。
This is a configuration of my project:
Hope this will help.
请检查contextConfigLocation。 param-value 应为classpath*:applicationContext.xml。请检查我的示例中的侦听器配置。希望我有帮助!
这是我的 web.xml 配置,效果很好:
Please check contextConfigLocation. The param-value should be classpath*:applicationContext.xml. Please check the listeners configuration also in my example. Hope I helped!
This is my web.xml configuration which nicely works:
编辑:后来我意识到这里的根本问题很可能是缺少日志配置。在我们的例子中(将 SLF4J 与 log4j 结合使用),在
log4j.properties
中添加正确的配置后,会出现各种警告和警告。即使使用 Tomcat,库记录的错误也变得可见。我尝试使用 Jetty 而不是 Tomcat,并开始收到更好的错误消息。结果发现有几个库丢失了——我已经使用过的一些库所需的东西。
有些库显然需要我添加的公共日志记录。下一步:
添加了 spring-asm。下一步:
添加了 spring-aop。接下来是一些不太直接的事情:
在 Spring 博客评论。显然它已从 spring-aop 中完全删除,您需要从以下位置获取 aopalliance.jar Sourceforge。
(我认为这种沼泽是 Java EE 最糟糕的情况:我不知道
spring-asm
或spring-aop
是什么,更不用说aopalliance
> 做,但显然我需要它们:-P)所以,添加了 aopalliance.jar。后来我还需要添加 spring-expression 和 cglib-2.2(Hibernate 自带的)。
之后,我的 Spring/Hibernate 持久层配置仍然存在一些问题,但它们超出了这个问题的范围。否则检票口和Spring 现在可以很好地工作(例如,用于在 Wicket 页面上注入服务层对象)。
我想这样做的一个寓意是,在某些情况下,Tomcat 会吃掉有用的错误消息,而 Jetty 可能更适合调试。另外,使用 Maven 可能会对依赖地狱有所帮助(但它也不是没有问题)。
Edit: Later on I realised the root problem here most likely was missing log configuration. In our case (using SLF4J with log4j), after adding proper configuration in
log4j.properties
all kinds of warnings & errors logged by libraries became visible, even with Tomcat.I tried Jetty instead of Tomcat, and started getting better error messages. Turns out there were several libraries missing — stuff needed by some of the libraries I already used.
Some of the libs apparently require commons-logging, which I added. Next:
Added spring-asm. Next:
Added spring-aop. Next something a little less straight-forward:
Found discussion about aopalliance missing in Spring blog comments. Apparently it has been completely removed from spring-aop, and you need to get aopalliance.jar from sourceforge.
(I think this kind of swamp is Java EE at its worst: I don't know what
spring-asm
orspring-aop
let aloneaopalliance
do, but apparently I need them. :-P)So, added aopalliance.jar. Later I still needed to add spring-expression and cglib-2.2 (which comes with Hibernate).
After that, some problems with my Spring/Hibernate persistence layer configuration remain, but they are out of scope for this question. Otherwise Wicket & Spring now work nicely (e.g. for injecting service layer objects on Wicket pages).
I guess one moral of this is that in some cases Tomcat eats useful error messages and Jetty might be better for debugging. Also, using Maven would have probably helped with the dependency hell somewhat (but it's not free of problems either).