Джерси 2 - Как получить доступ к пользовательской величине аннотации в фильтре [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

5
задан Anatoly 26 August 2015 в 13:39
поделиться

1 ответ

Если вы используете JAX-RS 2.0, вы можете ввести ResourceInfo в ContainerRequestFilter, а затем получить java.lang.reflect.Method из. Из Method вы можете получить аннотацию. Например

@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecurityFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    // You can get the header from the `requestContext`
    @Override
    public void filter(ContainerRequestContext requestContext) {
        Method resourceMethod = resourceInfo.getResourceMethod();
        SecurityCheck annotation = resourceMethod.getAnnotation(SecurityCheck.class);
        // get some value from annotation

        if (notAllowedAccess) {
            throw new WebApplicationException(403);
        }
    }
}

Это (ResourceInfo) необходимо, но если вам нужно получить какое-то значение из аннотации, например @SecurityCheck("SomeRoleAllowed").

Если вам не нужно значение, и все, что вы хотите, для любого метода, аннотированного для фильтрации, то вы можете либо создать DynamicFeature, где вы привязываете каждый метод к фильтру. Например,

@Provider
public class SecurityCheckDynamicFeature implements DynamicFeature {
    @Override
    public void configure(ResourceInfo info, FeatureContext context) {
        Method method = info.getResourceMethod();
        SecurityCheck annotation = method.getAnnotation(SecurityCheck.class);
        if (annotation != null) {
            context.register(SecurityFilter.class);
        }
    }
}

Или другим способом является просто использовать @NameBinding в пользовательской аннотации

@NameBinding
@Target(...)
@Retention
public @interface SecurityCheck {}

. Затем вам необходимо аннотировать класс SecurityFilter с аннотацией , Любой метод или класс, аннотированный, будет проходить через фильтр.

Другие ресурсы:

7
ответ дан Paul Samsotha 19 August 2018 в 06:07
поделиться
  • 1
    Неправильно ли @Priority использовать @Priority(Priorities.AUTHORIZATION)? – Robin Jonsson 3 October 2017 в 06:18
Другие вопросы по тегам:

Похожие вопросы: