2016-02-05 251 views
3

我想为我的REST API端点应用授权过滤器,并且过滤器需要路径参数来执行过滤。这里是我的终点和代码:如何从ContainerRequestContext获取路径参数

端点:

curl --url 'localhost:80/reports/resources/org/12345/product/111 ' --request GET --header 'Authorization: <token here>' 

资源代码:

@Path("/resources") 
public class MyResource extends AbstractResource { 
... 
    @GET 
    @Path("/org/{orgId}/product/{productId}") 
    @Produces(MediaType.APPLICATION_JSON) 
    @RoleAuthenticated 
    public Response getResourcesReport(@PathParam("orgId") String orgId, 
             @PathParam("productId") String productId, 
             @Context HttpHeaders headers){....} 

筛选:

@PreMatching 
@RoleAuthenticated 
public class AuthorizationFilter implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
      MultivaluedMap<String, String> pathparam = requestContext.getUriInfo().getPathParameters(); <-- return empty map 
} 

我期待requestContext.getUriInfo().getPathParameters()返回以下的地图:

orgId 12345 
productId 111 

它是如何返回空映射的?以及如何从ContainerRequestContext获得路径参数?

回答

3

您在过滤器上使用了@PreMatching注释。

的Javadoc说:

万一过滤器应在赛前扩展点施加, 即之前的任何请求匹配已经被JAX-RS运行时进行的, 滤波器必须被标注用@PreMatching注释。

因此,在传入请求已被JAX-RS运行时与特定资源匹配之前调用过滤器,因此路径参数为空。

所以我想你需要删除@PreMatching注释。

+0

你是对的!我删除@PreMatching后,它的工作原理 – user468587