2014-02-09 94 views
0

這是一個關於更好地分離嵌入碼的代碼代碼接線servlets的問題。與jetty + guice運行的戰爭

我正在嘗試改編this sample code,這樣我就會得到一個可運行的戰爭,即可以放入現有Jetty容器的戰爭文件,或者使用類似java -jar webapp-runnable.war的命令運行獨立戰爭。 示例代碼屬於以下兩篇博文:No.1,No.2

我跟着GuiceServlet manual創建了一個web.xmlGuiceServletContextListener(見下文),但他們似乎沒有讓我走得很遠,mvn jetty:run;當我嘗試運行mvn jetty:run,我得到以下錯誤:

[main] DEBUG org.eclipse.jetty.util.log - Logging to Logger[org.eclipse.jetty.util.log] via org.eclipse.jetty.util.log.Slf4jLog 
WARN:oejw.WebAppContext:main: Failed startup of context [email protected]{/,file:/[...]/src/main/webapp/,STARTING}{file:/[...]/src/main/webapp/} 
com.google.inject.ConfigurationException: Guice configuration errors:||1) Explicit bindings are required and com.google.inject.servlet.InternalServletModule$BackwardsCompatibleServletContextProvider is not explicitly bound.| while locating com.google.inject.servlet.InternalServletModule$BackwardsCompatibleServletContextProvider||1 error 
    at [stack strace clipped] 

這裏是我的代碼。如前所述,我從this repo on github開始。

1)我提取的匿名內部類型AbstractModule從com.teamlazerbeez.http.HttpServerMain,放入一個新的類com.teamlazerbeez.http.HttpServerModule。這個類現在在創建Guice Injector in HttpServerMain (l36)時實例化。

2)web.xml

<?xml version="1.0" ?> 
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    metadata-complete="false" 
    version="3.0"> 

    <filter> 
     <filter-name>guiceFilter</filter-name> 
     <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>guiceFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <listener> 
     <listener-class>com.teamlazerbeez.http.GuiceServletConfig</listener-class> 
    </listener> 
</web-app> 

3)com.teamlazerbeez.http.GuiceServletConfig

public class GuiceServletConfig extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
     //I know this code not come close to doing what I want, but I just don't know where to start 
     return Guice.createInjector(new HttpServerModule()); 
    } 

} 

我的問題:我如何重構HttpServerMainmain方法和HttpServerModule在這樣的它們描述的設置過程變得可用e到我的GuiceServletConfigGuiceServletConfig看起來像這個工作?

回答

1

我從來沒有像罐子一樣的戰爭,所以我總是去尋找兩種解決方案之一。但是,在使用戰爭時,不難設置可在IDE中工作的嵌入式Jetty服務器。爲此,您可以使用WebAppContext使用web.xml進行設置。例如,請參閱this documentation。從那裏,所有的東西都應該像Guice網站所倡導的那樣工作。

但是,這不會產生可運行的戰爭(如java -jar yourapp.war),因爲jar具有不同的內部佈局。但是,如果你想要,你可以使用jetty-runner來解決這個問題,使用java -jar jetty-runner.jar yourapp.war

0

我把@Alexadvice,而忘記了創建一個獨立的可運行war,而是着力打造只是war,做大部分的接線,在一個吉斯ServletModule

爲此,我改變了我的HttpServerModule來擴展ServletModule(而不是AbstractModule),並把大部分HttpServerMain.main()邏輯在其configureServlets()方法:

public class HttpServerModule extends ServletModule { 
    @Override 
    protected void configureServlets() { 
     MetricRegistry metricRegistry = new MetricRegistry(); 
     bind(MetricRegistry.class).toInstance(metricRegistry); 

     install(new SandwichModule()); 
     install(new JerseyMetricsModule()); 

     JmxReporter reporter = JmxReporter.forRegistry(metricRegistry).build(); 
     reporter.start(); 
    } 
} 

你會發現,一些HttpServerMain.main()邏輯現在不再出現在Java代碼中。這是因爲web.xml現在處理這些事情。

我的web.xmlGuiceServletConfig保持不變,我現在可以使用mvn jetty:run command運行此操作。 HttpServerMain現在可以被刪除,因爲它不再有用。