如何在javax.servlet.Filter中注入ResourceInfo

时间:2018-03-11 22:53:13

标签: rest jersey jax-rs cxf jersey-2.0

我正在尝试根据服务方法注册时间指标,但无法注入ResourceInfo。

我想写一些通用逻辑来根据服务注册时间。

这是我的代码:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.ws.rs.container.ResourceInfo;

@WebFilter("/*")
public class MetricsGeneraterFilter implements Filter {

    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long elapsedTime = System.currentTimeMillis() - startTime;
        System.out.println(resourceInfo.getResourceMethod().getName() + "--->" + elapsedTime);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

}

如何在ResourceInfo注入javax.servlet.Filter

2 个答案:

答案 0 :(得分:0)

请尝试使用JAX-RS过滤器。这些操作就像Servlet过滤器一样,但更好,因为它们在JAX-RS的范围内,可以做许多Servlet过滤器无法做到的事情。

为了做到这一点,只需将该类实现ContainerResponseFilterContainerRequestContext,并将其添加到您的JAX-RS应用程序(即添加@Provider注释或将其添加到您的web.xml)。然后实现这两种方法。您可以将startTime存储在RequestContext对象的参数中。

我将使用指向我自己的过滤器的链接对此进行编辑,当我有机会时,它会完成此操作。

答案 1 :(得分:0)

我已使用%{whateverRootBeanIs.dispatch.duplicateView} ContainerRequestFilter来解决此问题。

ContainerRequestFilter:

ContainerResponseFilter

ContainerResponseFilter:

@Provider
public class RequestContextLoggingFilter implements ContainerRequestFilter{

    public static final String REQUEST_START_TIME = "REQUEST_START_TIME";

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        requestContext.setProperty(REQUEST_START_TIME, Instant.now());
    }
}

您还可以使用Jersey的监控和诊断模块:https://jersey.github.io/documentation/latest/monitoring_tracing.html

我没有在生产应用程序中使用它,因为它在发行版> 2.1

时处于测试阶段