2016-10-11 6 views
0

私のREST APIには、複数のサブリソースを持つリソースがあります。そのリソースへの呼び出しを傍受し、その後正常に実行を継続する方法はありますか?例えばJAX-RSのパスパラメータを持つ特定のパスの代行受信

/some-resource/{resource-id} 

がベースパスであると私はこれらのサブリソースは、多くの異なるクラスにプロバイダーとの複雑な構造を持っている

/some-resource/{resource-id}/sub-resource1/... 
/some-resource/{resource-id}/sub-resource2/... 
... 

のような複数のサブリソースを持っています。

したがって、パス/some-resource/{resource-id}で始まるリソースへのすべての呼び出しを傍受する方法はありますか?インターセプトとは、サブリソースの実装の前に呼び出されるパラメータとしてresource-idを持つメソッドを呼び出すことを意味し、例外をスローすることによってリクエストをキャンセルすることができますが、それ以外の場合は通常の実行を妨げません。

明らかに、sub-resource locatorsを使用すると、すべてのリクエストでベースパスに呼び出されるコードを使用できます。あなたがしたいと思っているサブリソースを探す必要があるので、それは傍受のために設計されているようではありません。

他のアイデアはありますか?

答えて

2

あなたはそのためRequestFilterを使用することができます。

@Provider 
public class SomeResourceFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     if (isSubresourceOfSomeResource(requestContext)) { 
      intercept(resourceId(requestContext)); 
     } 
    } 

    private boolean isSubresourceOfSomeResource(ContainerRequestContext requestContext) { 
     List<PathSegment> pathSegments = requestContext.getUriInfo().getPathSegments(); 
     return "some-resource".equals(getSegment(requestContext, 0)) && pathSegments.size() > 2; 
    } 

    private String resourceId(ContainerRequestContext requestContext) { 
     return getSegment(requestContext, 1); 
    } 

    private String getSegment(ContainerRequestContext requestContext, int index) { 
     return requestContext.getUriInfo().getPathSegments().get(index).getPath(); 
    } 

    private void intercept(String resourceId) { 
     // your code 
    } 
} 
関連する問題