Фильтрация сервлетов с использованием аннотации Java EE 6? - PullRequest
7 голосов
/ 16 ноября 2011

Можно ли смоделировать цепочку фильтров сервлетов, используя аннотации @ApplicationPath и @Path в EE 6?

Пример:

@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, но метод «фильтра» будет вызываться так, как если бы это была цепочка фильтров сервлета.Я знаю, что описанный выше подход не будет работать, но есть ли в этом роде аннотированный подход, который позволил бы добиться того же, как если бы «Фильтр» был настроен из файла web.xml?

1 Ответ

13 голосов
/ 16 ноября 2011

JBoss 7 (даже уже JBoss 6) поддерживает Java EE 6, который в свою очередь охватывает Servlet 3.0.Возможно, ваш web.xml был неправильно объявлен в соответствии с сервлетом 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, который является другим API (API веб-сервиса RESTful), построенным поверх сервлетов.Чтобы узнать больше о JAX-RS, может пригодиться руководство пользователя Джерси .

См. Также:

...