使用Jersey枚举资源

时间:2014-01-31 13:50:13

标签: java security rest jersey

我使用Jersey 1.17提供REST Web服务。

我知道泽西岛“知道”所有资源是什么,所以有没有办法让泽西岛给我一个完整的资源清单?

背景:我希望用户能够在资源级别配置用户/权限。为此,我想枚举Jersey发现的所有资源,以填充UI,以便用户为用户设置安全性。然后我会在数据库中保留用户/ URL权限。

解决方案

static class ResourceListBuilder
{
    private List<ResourceInfo> resourceInfos = new ArrayList<ResourceInfo>();

    public List<ResourceInfo> getResourceInfos()
    {
        return resourceInfos;
    }

    private void build( Application application )
    {
        for ( Class<?> aClass : application.getClasses() )
        {
            if ( isAnnotatedResourceClass( aClass ) )
            {
                AbstractResource resource = IntrospectionModeller.createResource( aClass );

                buildResource( resource, resource.getPath().getValue() );
            }
        }
    }

    private void buildResource( AbstractResource resource, String uriPrefix )
    {
        for ( AbstractSubResourceMethod srm : resource.getSubResourceMethods() )
        {
            String uri = uriPrefix + srm.getPath().getValue();

            resourceInfos.add( new ResourceInfo( uri, srm.getHttpMethod(), srm.getMethod().getName() ) );
        }

        for ( AbstractResourceMethod srm : resource.getResourceMethods() )
        {
            resourceInfos.add( new ResourceInfo( uriPrefix, srm.getHttpMethod(), srm.getMethod().getName() ) );
        }

        for ( AbstractSubResourceLocator locator : resource.getSubResourceLocators() )
        {
            AbstractResource locatorResource = IntrospectionModeller.createResource( locator.getMethod().getReturnType() );
            buildResource( locatorResource, uriPrefix + locator.getPath().getValue() );
        }
    }

    private boolean isAnnotatedResourceClass( Class rc )
    {
        if ( rc.isAnnotationPresent( Path.class ) )
        {
            return true;
        }

        for ( Class i : rc.getInterfaces() )
        {
            if ( i.isAnnotationPresent( Path.class ) )
            {
                return true;
            }
        }

        return false;
    }
}

static class ResourceInfo
{
    private String url;
    private String method;
    private String description;

    ResourceInfo( String url, String method, String description )
    {
        this.url = url;
        this.method = method;
        this.description = description;
    }

    public String getUrl()
    {
        return url;
    }

    public String getMethod()
    {
        return method;
    }

    public String getDescription()
    {
        return description;
    }
}

1 个答案:

答案 0 :(得分:1)

使用Jersey here提出了一个很好的解决方案IntrospectionModeller

解决方案显示了如何开发服务以列出可以使用cURL命令调用的所有已部署资源。