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

Rest 如何在javax.servlet.Filter中注入ResourceInfo,rest,jersey,jax-rs,cxf,jersey-2.0,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.Se

我试图根据服务方法注册时间度量,但无法注入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 {
    }

}

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

尝试使用JAX-RS过滤器。它们的操作与Servlet过滤器一样,但更好,因为它们在JAX-RS的范围内,可以完成Servlet过滤器无法完成的许多事情

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


我将通过一个指向我自己的过滤器的链接来编辑此内容,该过滤器在我有机会时会执行此操作。

我使用了
ContainerRequestFilter
ContainerResponseFilter
来解决此问题

ContainerRequestFilter:

@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());
    }
}
ContainerResponseFilter:

@Provider
@Priority(Priorities.USER)
public class ResponseLogFilter implements ContainerResponseFilter{

private Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);

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

      try {
          Instant end = Instant.now();
          Instant start = (Instant) requestContext.getProperty(RequestContextLoggingFilter.REQUEST_START_TIME);
          logger.info("Done executing request with request_execution_time={} ms",
                Duration.between(start, end).toMillis());
      }catch (Exception e){
          logger.warn("error logging response time", e);
      }

  }
}
您还可以使用Jersey的监视和诊断模块:

我还没有在生产应用程序中使用它,因为它是从2.1版开始的beta版