Dropwizard路径:获取应用程序中的所有路径

use*_*180 5 java dropwizard

有谁知道如何获得有关使用什么路径的相同信息,例如在dw应用程序启动时。我的意思是此行之后的输出:

io.dropwizard.jersey.DropwizardResourceConfig: The following paths were found for the configured resources:
GET     /path/of/res/test (this.is.the.class.package.info.MyRessource)
POST     /path/of/res/test2 (this.is.the.class.package.info.MyRessource2)
Run Code Online (Sandbox Code Playgroud)

我必须检查是否存在特定路径。

use*_*180 2

这个解决方案对我有用(DW 0.7.1):

private Multimap<String, String> getEndpoints(Environment environment)
{
    Multimap<String, String> resources = ArrayListMultimap.create();
    ResourceConfig jrConfig = environment.jersey().getResourceConfig();
    Set<Object> dwSingletons = jrConfig.getSingletons();

    for (Object singletons : dwSingletons) {        

        if (singletons.getClass().isAnnotationPresent(Path.class)) {                
            AbstractResource resource = IntrospectionModeller.createResource(singletons.getClass());
            AbstractResource superResource = IntrospectionModeller.createResource(singletons.getClass().getSuperclass());

            String uriPrefix = getStringWithoutStartingSlash(resource.getPath().getValue());

            for (AbstractResourceMethod srm :resource.getResourceMethods())
            {
                String uri = uriPrefix;
                resources.put(uri,srm.getHttpMethod());
                LOG.info("Found http method " +srm.getHttpMethod() + " for the path " + uri + " returning (class) " + srm.getReturnType().getName());
            }


            for (AbstractSubResourceMethod srm :resource.getSubResourceMethods())
            {           
                //extended resources methods will be added by hand
                if(superResource != null){
                    for (AbstractSubResourceMethod superSrm : superResource.getSubResourceMethods())
                    {
                        String srmPath = getStringWithoutStartingSlash(srm.getPath().getValue());
                        String superSrmPath = getStringWithoutStartingSlash(superSrm.getPath().getValue());                     

                        Class<?> srmClass = srm.getDeclaringResource().getResourceClass();
                        Class<?> superSrmClass = superSrm.getDeclaringResource().getResourceClass();

                        //add superclass method if methodName is not equal superMethodName
                        if(srmClass.getSuperclass().equals(superSrmClass) && !srm.getMethod().getName().equals(superSrm.getMethod().getName())){
                            String uri = uriPrefix + "/" + srmPath  + "/" + superSrmPath ;                              
                            resources.put(uri,superSrm.getHttpMethod());
                            LOG.info("Found http method " +superSrm.getHttpMethod() + " for the path " + uri + " returning (class) " + superSrm.getReturnType().getName());
                        }   
                    }
                }

                String uri = uriPrefix + "/" + getStringWithoutStartingSlash(srm.getPath().getValue());
                resources.put(uri,srm.getHttpMethod());
                LOG.info("Found http method " +srm.getHttpMethod() + " for the path " + uri + " returning (class) " + srm.getReturnType().getName());           
            }               
        }
    }        
    return resources;
    }
Run Code Online (Sandbox Code Playgroud)

但 @PathParam 注释也很简单,例如 if @Path("/{id}") then sth。就像'.../{id}'将被使用!

如果你扩展你的资源并且超类也有路径注释,那么这个方法也会产生信息,甚至比默认的 DW logEndpoints() 方法更多!

仅供参考:课堂上使用的进口

import java.util.Set;
import javax.ws.rs.Path;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.model.AbstractResource;
import com.sun.jersey.api.model.AbstractResourceMethod;
import com.sun.jersey.api.model.AbstractSubResourceMethod;
import com.sun.jersey.server.impl.modelapi.annotation.IntrospectionModeller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;  
import io.dropwizard.setup.Environment;
Run Code Online (Sandbox Code Playgroud)