我开始使用Spring MVC编写应用程序,然后决定使用Tapestry。我想保留我最初使用的无XML配置方法。我第一次尝试这个:
public class ServletConfig implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// Spring //
AnnotationConfigWebApplicationContext rootContext = new
AnnotationConfigWebApplicationContext();
rootContext.register(PersistenceContext.class, ApplicationContext.class);
servletContext.addListener(new ContextLoaderListener(rootContext));
// Tapestry //
servletContext.setInitParameter("tapestry.app-package", "...");
FilterRegistration.Dynamic filter = servletContext.addFilter("app", TapestrySpringFilter.class);
filter.addMappingForUrlPatterns(null, false, "/*");
}
}
这里的问题是tapestry使用空构造函数创建另一个ContextLoaderListener。它不是接受WebApplicationContext,而是查看contextClass和contextConfigLocation init参数。所以我尝试了这个:
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// Spring //
servletContext.setInitParameter("contextClass",
"org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
servletContext
.setInitParameter(
"contextConfigLocation",
"...config.PersistenceContext ...config.ApplicationContext");
// Tapestry //
servletContext.setInitParameter("tapestry.app-package", "...");
FilterRegistration.Dynamic filter = servletContext.addFilter("app", TapestrySpringFilter.class);
filter.addMappingForUrlPatterns(null, false, "/*");
}
导致了这个:
java.lang.IllegalArgumentException: When using the Tapestry/Spring integration library, you must specifiy a context class that extends from org.apache.tapestry5.spring.TapestryApplicationContext. Class org.springframework.web.context.support.AnnotationConfigWebApplicationContext does not. Update the 'contextClass' servlet context init parameter.
TapestryApplicationContext继承自org.springframework.web.context.support.XmlWebApplicationContext。所以我的问题:是否有办法使用这种方法使基于注释的配置工作?如果没有,是否有另一种方法可以让我使用它?或者没有办法避免使用XML?
我尝试恢复到我在这里放置的ServletConfig的第一个版本,但我添加了
servletContext.setInitParameter("tapestry.use-external-spring-context", "true");
我不再收到错误消息,但页面也没有加载。当我尝试加载/ app /,而不是加载索引页面时,我得到了这个:
<html>
<head>
<title>Error</title>
</head>
<body>/app/index.jsp</body>
</html>
我不确定是什么导致这种情况,我在日志中找不到任何指示任何问题的内容。我认为调度员服务存在某种问题。以前有人见过这种错误吗?我不确定这是否与我原来的问题无关,或者这是否是我的方法无效的症状。如果有人可以告诉我这是一个单独的问题,我会采取适当的行动。
答案 0 :(得分:1)
开箱即用的spring integration需要一个XML文件。
扩展SpringModuleDef并覆盖locateApplicationContext
以返回AnnotationConfigApplicationContext
然后,您将编写自己的TapestrySpringFilter实现,该实现将加载新的SpringModuleDef子类。
- 编辑---
我错了,tapestry spring集成使用WebApplicationContextUtils.getWebApplicationContext(servletContext)
来查找ApplicationContext。因此,您可以在加载TapestryStringFilter之前使用ApplicationContext初始化servlet上下文,它应该可以正常工作。
例如
ApplicationContext myContext = createAnnotationBasedAppContext();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, myContext);