2014-02-09 3 views
0

Это вопрос о том, как лучше отделять код для встраивания пристани из кода для проводки до сервлетов.Бегущая война с причалом + guice

Я пытаюсь адаптировать this sample code так, что я получу бегущую войну, т. Е. Военный файл, который я могу занести в существующий контейнер Jetty, или запустить автономный с помощью команды типа java -jar webapp-runnable.war. Образец кода принадлежит этим двум блогам: No.1, No.2.

Я следовал GuiceServlet manual и создал web.xml и GuiceServletContextListener (смотри ниже), но они, кажется, не поймите меня очень далеко с 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. Этот класс теперь создается при создании Injector Guice 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 в такой что описанный ими процесс установки становится usabl e к моему GuiceServletConfig? И что должно быть GuiceServletConfig похоже, чтобы это сработало?

ответ

1

У меня никогда не было войны, работающей в качестве банки, поэтому я всегда выбираю одно из двух решений. Однако при использовании войны не сложно настроить встроенный сервер Jetty, который работает в вашей среде IDE. Для этого вы можете использовать WebAppContext, чтобы настроить его, используя web.xml. См. Пример this documentation. Оттуда все должно работать как защищаемое на сайте Guice.

Однако это не создаст войну (например, java -jar yourapp.war), потому что банки имеют разную внутреннюю компоновку. Однако, если вы хотите, вы можете использовать jetty-runner, чтобы исправить это, используя java -jar jetty-runner.jar yourapp.war.

0

Я взял @Alex «s advice и забыть о создании автономного-работоспособную war, и сосредоточившись на создании всего war, что делает большую часть проводки вверх в Guice 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.xml и GuiceServletConfig остаются без изменений, и теперь я могу запустить это с помощью mvn jetty:run command. Теперь HttpServerMain можно удалить, так как он больше ничего не полезен.

Смежные вопросы