使用tapestry-spring可以实现Servlet 3.0无XML配置吗?

时间:2013-07-18 20:00:21

标签: java spring tapestry

我开始使用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>

我不确定是什么导致这种情况,我在日志中找不到任何指示任何问题的内容。我认为调度员服务存在某种问题。以前有人见过这种错误吗?我不确定这是否与我原来的问题无关,或者这是否是我的方法无效的症状。如果有人可以告诉我这是一个单独的问题,我会采取适当的行动。

1 个答案:

答案 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);