Доступ к метаинформации, сформированной в ReaderInterceptor / ContainerRequestFilter для использования в WriterInterceptor - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь записать информацию о запросах и ответах в JAX-RS. Я формирую определенную мета-информацию в запросе-перехватчике / фильтре, который мне нужно использовать в ответном перехватчике.

Есть ли способ передачи информации от перехватчика запроса (ReaderInterceptor/ContainerRequestFilter) к перехватчику ответа (WriterInterceptor) в JAX-RS?

В Spring это не проблема, так как это один метод, где обрабатываются и запрос, и ответ.

1 Ответ

0 голосов
/ 21 января 2020

Я придумал следующий способ.

@Provider
public class LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter, WriterInterceptor {

@Override
public void filter(ContainerRequestContext reqContext) throws IOException {
        String apiPath = uri.getPath();

        MultivaluedMap<String, String> metaMap = getMetaMap(reqContext);

        reqContext.setProperty(Constants.META_MAP, metaMap);
        reqContext.setProperty(Constants.API_PATH, apiPath);

        logRequest(reqContext, apiPath);
    }
}

@Override
public void aroundWriteTo(WriterInterceptorContext context)
    throws IOException, WebApplicationException {
    Object apiPathObj = context.getProperty(Constants.API_PATH);
    Object metaMapObj = context.getProperty(Constants.META_MAP);
    Object respHeadersObj = context.getProperty(Constants.RESPONSE_HEADERS);
    Object statusObj = context.getProperty(Constants.STATUS);

    //work with the values

    context.proceed();
}

@Override
public void filter(ContainerRequestContext containerRequestContext,
    ContainerResponseContext containerResponseContext) throws IOException {
    containerRequestContext
        .setProperty(Constants.RESPONSE_HEADERS, containerResponseContext.getStringHeaders());
    containerRequestContext.setProperty(Constants.STATUS, containerResponseContext.getStatus());
}
}

Это работает, но я хотел бы получить обратную связь или какой-нибудь лучший способ справиться с этим.

PS: я хотел MultivaluedMap и, следовательно, передавал его от ContainerResponseFilter.

...