Создайте JSONP с помощью ContainerRequestContext # abortWith - PullRequest
0 голосов
/ 07 мая 2018

У меня есть это приложение на основе Jersey2 с пользовательским ContainerRequestFilter.

Когда вызывается метод filter(ContainerRequestContext), я хочу выполнить проверку и, если необходимо, хочу иметь возможность остановить запрос перед входом в основную логику приложения. В настоящее время я использую метод ContainerRequestContext#abortWith, чтобы заблокировать вызов и вернуть клиенту ответ «ошибка».

Мое приложение возвращает JSONP клиенту, и если я блокирую с abortWith, ответ всегда будет JSON.

Глядя на источники джерси, которые я нашел org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor, который отвечает за сериализацию JSONP. В потоке abortWith я вижу, что не удается найти аннотацию JSONP, но я не знаю, где он ее ищет.

Мой метод имеет это, фактически в "нормальном" сценарии (без abortWith) я правильно вижу формат JSONP.

1 Ответ

0 голосов
/ 08 мая 2018

Я нашел решение.

Метод ContainerRequestFilter#filter был похож на

public void filter(final ContainerRequestContext crc) throws IOException {
    if (/* logic */) {
        CustomObject ret = new CustomObject();
        ret.error = "error message";
        crc.abortWith(Response.ok(ret)).build());
    }
}

JsonWithPaddingInterceptor ожидал ответа с аннотацией JSONP, поэтому я извлекаю их из ResourceInfo#resourceMethod с чем-то вроде

public void filter(final ContainerRequestContext crc) throws IOException {
    if (/* logic */) {
        Annotation[] as = this.resourceInfo.getResourceMethod().getAnnotations();

        CustomObject ret = new CustomObject();
        ret.error = "error message";
        crc.abortWith(Response.ok().entity(ret, as).build());
    }
}

таким образом, аннотация правильно найдена

...