Перехватить вызов метода Jax-RS - PullRequest
0 голосов
/ 21 марта 2020

Я бы хотел перехватывать каждый вызов метода для методов, которые помечены @HttpMethod или какой-либо дополнительной аннотацией этого.

Мне не удобно создавать аннотацию, которую я помещаю на каждом методе, который может быть вызван Jax-RS, поэтому я обратился к WriterInterceptor и ReaderInterceptor.

Однако это не то, что я ищу, так как мне бы хотелось, чтобы перехватывать вызов метода вместо процесса чтения / записи.

Фильтры недостаточно хороши, так как я не могу отловить исключения, выданные методом.

Первое решение (обычное java -ee перехватчик) был бы лучшим вариантом, если бы мне не приходилось аннотировать каждый метод произвольной аннотацией.

Какие еще варианты у меня есть?

1 Ответ

1 голос
/ 23 марта 2020

Это может быть спецификация контейнера c, но, по крайней мере, на Wildfly 18, я думаю, что могу делать то, что вы хотите Я использую фильтр сервлетов и чистый JAX-RS - ничего, что RestEasy указывает c (ни Spring). Мой код Application:

@ApplicationPath("/rest")
public class RestApplicationConfig extends Application {
    // intentionally empty
}

Мой фильтр:

@WebFilter(urlPatterns = "/rest/*")
public class FilterTest implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {

        try {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        catch( Throwable t ) {
            // handle exception
        }
    }
}

Обратите внимание, что я делаю попытку / ловлю вокруг вызова doFilter. Здесь вы можете поймать любые исключения. Интересным дополнением является то, что у меня также есть ContainerRequestFilter:

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

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException  {
    }
}

, и catch в фильтре не вызывается, пока этот код не запускается в Wildfly. Это имеет смысл, поскольку это часть JAX-RS.

Моя "услуга" - это просто:

@Path("/v1/exception")
public class ExceptionService {
    @Produces({ MediaType.TEXT_PLAIN })
    @GET
    public Response getException() {
        throw new InternalError("this is an internal error");
    }
}
...