java - 使用 Java EE 6 注释的 Servlet 过滤?

标签 java jakarta-ee servlets annotations servlet-filters

是否可以在 EE 6 中使用 @ApplicationPath 和 @Path 注释来模拟 servlet 过滤器链?

例子:

@ApplicationPath("/api")
class Filter extends Application { 
    @Path("/*")
    public void filter() {
        log.info("Request to API");
    }
}

...

@Path("/foo")
class Foo {
    @GET
    @Path("/bar")
    @Produces("text/plain")
    public String bar() {
        return "Hello World";
    }
}

URL 的位置 http://foobar.com/api/foo/bar但是“filter”方法将被调用,就好像它是一个 servlet 过滤器链一样。我知道上面的方法行不通,但是同类中是否有带注释的方法可以实现与从 web.xml 文件配置“过滤器”一样的效果?

最佳答案

JBoss 7(甚至 JBoss 6 已经)支持 Java EE 6,后者又涵盖了 Servlet 3.0。也许您的 web.xml 被错误地声明为符合 Servlet 2.5,这导致 @WebFilter 根本无法工作。确保您的 web.xml 的根声明被声明为符合 Servlet 3.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"
    version="3.0">

然后你可以使用@WebFilter :

@WebFilter("/api/*")
public class FooFilter implements Filter {

    // ...

}

您在那里展示的示例是 JAX-RS 的一部分,JAX-RS 是另一个构建在 Servlet 之上的 API(RESTful 网络服务 API)。要了解有关 JAX-RS 的更多信息,请访问 Jersey user guide可能会有用。

另见:

关于java - 使用 Java EE 6 注释的 Servlet 过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146530/

相关文章:

java - 基于移位方向和空格数的凯撒密码移位Java

java - 使用java 8按类型列表: JAVA的对象属性对对象列表进行分组

java - 递归地从扫描仪输入中反转数字_order_

java - 将大型应用程序从 JavaEE 迁移到 Akka

java - 基于 Web 的应用程序设计模式

HTML 下拉列表设置从 JSP/servlet 中的数据库中选择的默认值

java - Maven:pom编译后添加了不同版本的slf4 jar,war因此出现版本冲突错误

Java CDI : Do interceptors have scope?

jakarta-ee - 使用 Java 和 Plone CMS 进行内容交付

java - ServletContextListener-contextDestroyed 中是否需要 ServletContext-removeAttribute