ServletModule.filter против @WebFilter - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь следовать минимальному руководству по использованию Guice для веб-сервера, без необходимости web.xml: http://www.remmelt.com/post/minimal-guice-servlet-without-web-xml/

Как и создатель учебника, мне не удается заставить команду фильтра ServletModule работать должным образом, но все тот же код, вместо этого использование атрибута @WebFilter в классе Filter приводит к работающему веб-серверу.

Как мне заставить работать фильтр ServletModule? В чем разница между методом фильтра ServletModule и атрибутом @WebFilter, который приводит к этой разнице в ожиданиях?

Помимо того, что описано в руководстве, я также пытался связать фильтр перед командой «filter».

@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!".

Используя фильтр ("/ *"), я вместо этого получаю 404 на тот же запрос.

1 Ответ

0 голосов
/ 03 июля 2019

Насколько я могу судить, то, что я ищу, невозможно.Для того чтобы фильтр был объявлен без атрибута @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, нет способа избежать обоих для более удобочитаемой конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...