Jersey提供两个类来与资源上的注释进行交互:
ResourceFilterFactory定义了一个create方法(实现),AbstractMethod该方法可以访问方法和类注释.
ContainerRequestFilter和ContainerResponseFilter定义了一个filter接受请求/响应的方法(实现),但这些方法只能访问被调用的方法注释,而不是第一类.
我正在尝试实现一个CacheControl注释,它以下列方式定义HTTP缓存头.
@Path("/path")
@CacheControl(maxAge = 172800)
public class Resource
{
@GET
@Path("/{id}")
@CacheControl(mustRevalidate = true)
public Response get(@PathParam("id") Long id)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我不想为我的应用程序中定义的每个REST方法创建一个新的CacheControlFilter.
public class FilterFactory implements ResourceFilterFactory
{
@Override
public List<ResourceFilter> create(AbstractMethod method)
{
List<ResourceFilter> filters = newArrayList();
if (isAnnotationPresent(method, CacheControl.class))
filters.add(new CacheControlFilter(method));
return filters;
}
private boolean isAnnotationPresent(AbstractMethod method, Class<? extends Annotation> clazz)
{
return method.isAnnotationPresent(clazz) || method.getResource().isAnnotationPresent(clazz);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在请求过滤器中获取请求的表单参数:
@Override
public ContainerRequest filter(final ContainerRequest request) {
final Form formParameters = request.getFormParameters();
//logic
return request;
}
Run Code Online (Sandbox Code Playgroud)
但是,表格似乎总是空的.该HttpRequestContext.getFormParameters()文件说:
获取请求实体的表单参数.
此方法将确保缓冲请求实体,以便应用程序可以使用它.
返回: 表单参数,如果有请求实体且内容类型为"application/x-www-form-urlencoded",否则将返回不包含参数的实例.
我的资源是注释的@Consumes("application/x-www-form-urlencoded"),虽然它在请求过滤器之后才会匹配 - 这就是为什么这不起作用?
我尝试做一些研究,但未能找到任何确凿的证据证明这是否可行.有这个为期4年的讨论,Paul Sandoz说:
如果您正在使用泽西过滤器或使用,
HttpRequestContext您可以获得如下表单参数:[到Jersey 1.1.1的断开链接HttpRequestContext.getFormParameters]
我还发现了这个有关如何在请求过滤器中获取multipart/form-data表单字段的3年讨论.在其中,Paul Sandoz使用以下代码:
// Buffer
InputStream in = request.getEntityInputStream();
if (in.getClass() != ByteArrayInputStream.class) {
// Buffer input
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ReaderWriter.writeTo(in, baos);
} catch (IOException ex) {
throw new ContainerException(ex);
}
in = new …Run Code Online (Sandbox Code Playgroud) 在内部ContainerResponseFilter我想得到"处理程序",即类@Path和@GET/ @PUT-annotated方法匹配我将提供的URL.
例:
someJerseyVariable.getHandlerForURI(request.getRequestUri());
Run Code Online (Sandbox Code Playgroud)
我找不到任何类似的方法.
我想要这个的原因是,要统计每个处理程序服务的请求数以及成功/失败的数量.还欢迎任何其他替代方案.