java - ServletModule.filter 与 @WebFilter

标签 java guice servlet-filters

我正在尝试遵循有关使用 Guice 作为 Web 服务器的最小教程,而不需要 web.xml:http://www.remmelt.com/post/minimal-guice-servlet-without-web-xml/

与本教程的创建者一样,我无法使 ServletModule 过滤器命令按预期工作,但所有相同的代码,而不是在 Filter 类上使用 @WebFilter 属性,都会产生一个工作的 Web 服务器。

如何使 ServletModule 过滤器工作? ServletModule 的过滤器方法和 @WebFilter 属性之间有什么区别导致了这种期望的差异?

除了本教程中介绍的内容之外,我还尝试在“filter”命令之前绑定(bind)过滤器。

@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。

最佳答案

据我所知,我正在寻找的东西是不可能的。为了声明一个没有@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,为了更容易阅读的配置,没有办法避免这两者。

关于java - ServletModule.filter 与 @WebFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56845478/

相关文章:

java - Android 单元测试和类成员可见性

java - 使用gson问题将jsonobject转换为字符串

java - HandlerInterceptor 有一个对象处理程序参数,什么类型将被传递到拦截器中?

java - 获取 Guice 对象图中的对象

java - 如何分析 Guice 配置方法

java - 如何将 Java 对象转换为 C++ 对象?

Java:使用 Inject 注释对类进行 Junit

servlets - 为 Servlet Filter 提供多个 URL 模式

java - 需要使用单元测试框架来测试 Servlet、Filters 和 JPA 等 J2EE 组件

java - 使用 Spring-Test-MVC 对 Spring-Security 进行单元测试 - 集成 FilterChain/ServletFilter