Фильтр связывания имени Джерси не вызван для метода подресурса - PullRequest
0 голосов
/ 26 апреля 2018

При использовании Jersey 2.25 с методами подресурса @NamedBinding фильтры не вызываются.

В дальнейшем метод getData () вызывает AuthorizationFilter, а метод getSubDetails () - нет.

@NameBinding
@Retention(RUNTIME)
@Target({ TYPE, METHOD })
public @interface Secured {
    Permission[] value() default {};
}


@Secured
@Provider
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
...
}

@Produces(MediaType.APPLICATION_JSON)
@Path("api/v1/jobs/{jobId}/document-sources")
@Secured(Permission.JOB_READER)
public class MyEndpoint {


    @Path("/{subId}")
    @GET
    @Secured(Permission.READ)
    public Class<?> getData(@PathParam("subId") String subId){
        return "data";
    }

    @Path("/{subId}/details")
    @Secured(Permission.READ)
    public Class<?> getSubDetails(@PathParam("subId") String subId){
        return SubDetails.class;
    }
}

Документация JAX-RS (https://docs.oracle.com/javaee/7/api/javax/ws/rs/container/ContainerRequestFilter.html), по-видимому, подразумевает, что фильтр должен работать на подресурсах.

Я что-то не так делаю?Фильтры NameBinding больше не применяются к методам подресурсов?

1 Ответ

0 голосов
/ 26 апреля 2018

Для всех, кто сталкивался с этим:

Методы локатора подресурсов не запускают фильтры NameBinding для них (по крайней мере, в Джерси).Я не могу найти никакой документации, которая говорит, является ли это правильным или нет.

В нашем случае, фильтр был важен, потому что он добавлял объекты в контекст запроса, которые использовались методом локатора, чтобы определить, какая подпрограммаРесурс для возврата.Создание этих объектов довольно дорого (включает вызовы базы данных), поэтому мы не хотели просто дублировать код создания объекта в методе локатора подресурсов (плюс это нарушило бы DRY).

РешениеЯ закончил тем, что переместил логику создания объекта в Фабрику, и заставил Фабрику использовать кеширование контекста запроса, чтобы гарантировать, что он выполняет инициализацию объекта только один раз.Затем фабрика используется в фильтре (для авторизации) и в методе подресурса (для определения того, какой подресурс следует отправить).Тогда каждый подресурс должен иметь аннотацию фильтра авторизации.

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