Я пытаюсь следовать минимальному руководству по использованию Guice для веб-сервера без необходимости использования web.xml: http://www.remmelt.com/post/minimal-guice-servlet-without-web-xml/
Как и создатель учебника, я не могу заставить команду фильтра ServletModule работать должным образом, но все тот же код, вместо этого использование атрибута @WebFilter в классе Filter приводит к рабочему веб-серверу.
Как заставить фильтр ServletModule работать? В чем разница между методом фильтрации ServletModule и атрибутом @WebFilter, которые приводят к этой разнице в ожиданиях?
Помимо того, что описано в руководстве, я также попытался связать фильтр перед командой «фильтр».
@WebListener
public class GuiceServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
super.configureServlets();
serve("/*").with(WiredServlet.class);
filter("/*").through(GuiceWebFilter.class);
bind(MessageSender.class).to(MessageSenderImpl.class);
}
});
}
}
public class GuiceWebFilter extends GuiceFilter{
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
super.doFilter(servletRequest, servletResponse, filterChain);
}
}
@Singleton
public class WiredServlet extends HttpServlet {
@Inject
private MessageSender messageSender;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getOutputStream().print("Hello world!");
}
}
Используя @WebFilter("/*"), я получаю простой ответ "Hello World!".
Используя filter("/*"), вместо этого я получаю 404 по тому же запросу.




Насколько я могу судить, то, что я ищу, невозможно. Чтобы фильтр был объявлен без атрибута @WebFilter, у вас должен быть такой файл web.xml:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app id = "WebApp_ID" version = "2.4"
xmlns = "http://java.sun.com/xml/ns/j2ee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Application</display-name>
<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>
</web-app>
В общем, вы можете либо использовать атрибут @WebFilter, либо у вас должен быть файл web.xml, нет никакого способа избежать обоих для более легко читаемой конфигурации.