我使用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;
}
}
答案 0 :(得分:1)
使用Jersey here提出了一个很好的解决方案IntrospectionModeller。
解决方案显示了如何开发服务以列出可以使用cURL命令调用的所有已部署资源。