使用Java EE 6注释进行Servlet过滤?

tra*_*ega 7 java annotations servlets java-ee servlet-filters

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

例:

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

...

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

URL的位置是http://foobar.com/api/foo/bar,但"filter"方法将被调用,就像它是一个servlet过滤器链一样.我知道上面的方法不会起作用,但是在这种方法中是否有一个带注释的方法,就像从web.xml文件配置"过滤器"一样?

Bal*_*usC 13

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">
Run Code Online (Sandbox Code Playgroud)

然后你可以使用@WebFilter:

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

    // ...

}
Run Code Online (Sandbox Code Playgroud)

你在那里展示的例子是JAX-RS的一部分,它是在Servlets之上构建的另一个API(RESTful webservice API).要了解有关JAX-RS的更多信息,Jersey用户指南可能很有用.

也可以看看: