2013-07-18 93 views
2

我開始使用Spring MVC編寫應用程序,然後決定用Tapestry代替。我想保留最初使用的無XML配置方法。我第一次嘗試這樣的:是否可以使用tapestry-spring實現Servlet 3.0無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, "/*"); 
    } 
} 

這裏的問題是,掛毯創建另一個ContextLoaderListener的,使用空的構造。它不是接收WebApplicationContext,而是查看contextClass和contextConfigLocation初始參數。所以,我想這一點:

@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"); 

我不再收到錯誤消息,但頁面沒有加載任何。當我嘗試加載/應用/,而不是加載索引頁面我得到這個:

<html> 
    <head> 
     <title>Error</title> 
    </head> 
    <body>/app/index.jsp</body> 
</html> 

我不知道是什麼導致了這一點,我無法找到日誌什麼說明任何問題。我在考慮調度員服務存在某種問題。有沒有人看過這種類型的錯誤?我不確定這是否與我原來的問題無關,或者這是我的方法無效的症狀。如果有人能告訴我這是一個單獨的問題,我會採取適當的行動。

回答

1

開箱即用的spring integration需要一個XML文件。

它不會是太難延長SpringModuleDef並覆蓋locateApplicationContext返回一個AnnotationConfigApplicationContext

你可以這樣寫自己的TapestrySpringFilter實現它加載新的SpringModuleDef子類。

--edit ---

我錯了,掛毯Spring集成使用WebApplicationContextUtils.getWebApplicationContext(servletContext)來查詢的ApplicationContext。所以你可以在加載TapestryStringFilter之前用ApplicationContext初始化servlet上下文,它應該可以工作。

ApplicationContext myContext = createAnnotationBasedAppContext(); 
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, myContext); 
相關問題