我正在尝试实现一个ContainerRequestFilter
对请求参数进行自定义验证的方法。我需要查找将与URI匹配的资源方法,以便可以从方法的参数中抓取自定义注释。
基于此答案,我应该能够注入ExtendedUriInfo
然后使用它来匹配方法:
public final class MyRequestFilter implements ContainerRequestFilter {
@Context private ExtendedUriInfo uriInfo;
@Override
public ContainerRequest filter(ContainerRequest containerRequest) {
System.out.println(uriInfo.getMatchedMethod());
return containerRequest;
}
}
但是getMatchedMethod
显然返回null
,一直到实际调用该方法为止(这时我进行验证为时已晚)。
Method
在调用资源方法之前,如何检索将与给定URI匹配的?
对于那些感兴趣的人,我正在尝试进行自己所需的参数验证,如JERSEY-351中所述。
我想出了如何仅使用Jersey来解决问题的方法。显然,没有办法将请求的URI与将在调用该方法之前匹配的方法进行匹配,至少在Jersey1.x中。但是,我可以使用a为每个单独的资源方法ResourceFilterFactory
创建一个ResourceFilter
-这样,这些过滤器就可以提前知道目标方法。
这是我的解决方案,包括验证所需的查询参数(使用Guava和JSR 305):
public final class ValidationFilterFactory implements ResourceFilterFactory {
@Override
public List<ResourceFilter> create(AbstractMethod abstractMethod) {
//keep track of required query param names
final ImmutableSet.Builder<String> requiredQueryParamsBuilder =
ImmutableSet.builder();
//get the list of params from the resource method
final ImmutableList<Parameter> params =
Invokable.from(abstractMethod.getMethod()).getParameters();
for (Parameter param : params) {
//if the param isn't marked as @Nullable,
if (!param.isAnnotationPresent(Nullable.class)) {
//try getting the @QueryParam value
@Nullable final QueryParam queryParam =
param.getAnnotation(QueryParam.class);
//if it's present, add its value to the set
if (queryParam != null) {
requiredQueryParamsBuilder.add(queryParam.value());
}
}
}
//return the new validation filter for this resource method
return Collections.<ResourceFilter>singletonList(
new ValidationFilter(requiredQueryParamsBuilder.build())
);
}
private static final class ValidationFilter implements ResourceFilter {
final ImmutableSet<String> requiredQueryParams;
private ValidationFilter(ImmutableSet<String> requiredQueryParams) {
this.requiredQueryParams = requiredQueryParams;
}
@Override
public ContainerRequestFilter getRequestFilter() {
return new ContainerRequestFilter() {
@Override
public ContainerRequest filter(ContainerRequest request) {
final Collection<String> missingRequiredParams =
Sets.difference(
requiredQueryParams,
request.getQueryParameters().keySet()
);
if (!missingRequiredParams.isEmpty()) {
final String message =
"Required query params missing: " +
Joiner.on(", ").join(missingRequiredParams);
final Response response = Response
.status(Status.BAD_REQUEST)
.entity(message)
.build();
throw new WebApplicationException(response);
}
return request;
}
};
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
}
}
并在ResourceFilterFactory
Jersey中注册为servlet的init参数web.xml
:
<init-param>
<param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
<param-value>my.package.name.ValidationFilterFactory</param-value>
</init-param>
在启动时,ValidationFilterFactory.create
为Jersey所检测到的每个资源方法调用。
多亏了约书亚我才想通的。
问题内容: 但是我使用的是Java Jersey2.4,找不到ResourceFilterFactory或ResourceFilter类的任何标志。该文档也没有提及它们。它们是否已被弃用,或者它们是否真的隐藏得很好?如果已弃用它们,我该怎么用呢?泽西岛2.4和2.5现在是否可以从ContainerRequestFilter获取资源注释? 谢谢 问题答案: 如果要基于资源方法/类上可用的注释来修改请
我试图弄清楚如何使用自定义注释和HK2将一些东西注入到资源方法中。因为我处于Spring webapp环境中,所以我只是在现有的helloworld-spring-webapp Jersey 2示例的基础上进行了讨论。我的问题是,资源方法被调用了两次。第一次注射成功,第二次注射失败。 InjectionResolver.Resolve()方法 binder.configure()方法 单个调用的服
我希望通过ContainerRequestFilter中的ExtendedUriInfo检索matchedResources/matchedResults,以便检查路径是否应该受到保护。是否有一种方法可以创建一个在ExtendedUriInfo填充之后,但在调用匹配的资源类和方法之前调用的筛选器?
我正在开发一个Spring应用程序,并在HandlerInterceptorAdapter的预处理()方法中对用户进行身份验证,如果用户进行了身份验证,我将如下设置请求属性: 如果用户未通过身份验证,我是这样设置的 然后在稍后的控制器方法中,我用HttpServletRequest检索用户,如下所示: 问题是我需要在每个控制器方法中接收HttpServletRequest,以检查用户是否经过身份验
本文向大家介绍适配android7.0获取文件的Uri的方法,包括了适配android7.0获取文件的Uri的方法的使用技巧和注意事项,需要的朋友参考一下 前言# Android 7.0已经发布很久了,虽然市场份额还不是很高,但是流行起来都是早晚的事,所以适配Android 7.0刻不容缓。 Android 7.0 对系统进行了很多的优化:例如文件访问权限,省电,网络,后台等等,其中最突出的就是应