在 Dropwizard 中启用 Jersey RequestDispatcher 需要什么 jar

What jar's are required to enable Jersey RequestDispatcher in Dropwizard

我正在研究 article 尝试在现有的最小 Dropwizard 项目之上放置一层基本审计功能。

该文章还包含一个关联的 repository

那个repo中的gradle.build除了核心DW之外似乎没有任何额外的依赖:

dependencies {
    compile(
            'io.dropwizard:dropwizard-core:' + dropwizardVersion
    )
    testCompile(
            'junit:junit:4.11',
            'org.hamcrest:hamcrest-core:1.3',
            'org.mockito:mockito-all:1.9.5',
            'org.unitils:unitils-core:3.4.2'
    )
}

我的构建是在 Maven 中进行的,似乎包含等效的依赖项列表:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.dropwizard</groupId>
                <artifactId>dropwizard-bom</artifactId>
                <version>${dropwizard.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.dropwizard</groupId>
            <artifactId>dropwizard-core</artifactId>
        </dependency>
    </dependencies>

当我尝试构建等同于 this:

时,无法识别的是 RequestDispatcher / HttpContext 的导入

IntelliJ IDEA 似乎在类路径上识别这些:

然而,需要的是对 com.sun.jersey.api.core.HttpContext instead.

的引用

谁能告诉我这里可能缺少哪些额外的 jar 文件,或者可能是对 DW 之上审计功能的工作演示的一些参考。

提前致谢。

那篇文章还在使用 Jersey 1.x 时使用了较旧的 Dropwizard 版本。由于您使用的是使用 2.x 的较新版本,现在的方法是使用 ContainerRequestFilter。注入ResourceInfo即可获取资源信息。在 Jersey 1.x 中使用了 RequestDispatcher,因为当时有 ResourceInfo 这样的东西,所以这是一种获取资源 class 和资源方法的方法。

@Provider 
public class AuditRequestFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo info;

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

        Class<?> resourceClass = info.getResourceClass();
        Method resourceMethod = info.getResourceMethod();
    }
}

只需使用 Dropwizard 注册过滤器

env.jersey().register(AuditRequestFilter.class);

编辑

再次查看您链接到的代码,使用 ContainerResponseFilter 可能更好,因为您想在审核前检查状态代码。另外,要获取远程地址,您可以注入 HttpServletRequest。您还可以从 UriInfo

获取 URI 信息
@Provider
public class AuditRequestFilter implements ContainerResponseFilter {

    @Context
    private HttpServletRequest request;

    @Context
    private ResourceInfo info;

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

        int status = responseContext.getStatus();
        String remoteAddr = request.getRemoteAddr();

        UriInfo uriInfo = requestContext.getUriInfo();

        Class<?> resourceClass = info.getResourceClass();
        Method resourceMethod = info.getResourceMethod();
    }
}

另请参阅: