在 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();
}
}
另请参阅:
我正在研究 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
@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();
}
}
另请参阅: