以编程方式在Jersey中声明路径参数

以编程方式在Jersey中声明路径参数,jersey,jersey-2.0,Jersey,Jersey 2.0,我试图以编程方式创建jersey资源(无注释)。 我有一个方法raiseAlarm,它将名称和id作为输入参数。我希望从JSON输入中获取名称,并希望id来自path参数。代码看起来是这样的 public class JerseyExample { public static void main(String[] args) { JerseyExample deployer = new JerseyExample(); deployer.init(); }

我试图以编程方式创建jersey资源(无注释)。 我有一个方法raiseAlarm,它将名称和id作为输入参数。我希望从JSON输入中获取名称,并希望id来自path参数。代码看起来是这样的

public class JerseyExample {
    public static void main(String[] args) {
      JerseyExample deployer = new JerseyExample();
      deployer.init();
    }


public static class BaseResource extends ResourceConfig {
    public BaseResource() {
        init();
    }

    public void init() {
        try {
            Resource.Builder resourceBuilder2 = Resource.builder();
            resourceBuilder2.path("/raiseAlarm/{id}");
            ResourceMethod.Builder method2 = resourceBuilder2.addMethod("POST")
                    .consumes(MediaType.APPLICATION_JSON_TYPE)
                    .produces(MediaType.APPLICATION_JSON_TYPE)
                    .handledBy(this, this.getClass().getMethod("raiseAlarm", Name.class, String.class));

            Resource childResource1 = resourceBuilder2.build();

            Resource.Builder resourceBuilder = Resource.builder();
            resourceBuilder.path("/employee/status");
            resourceBuilder.addChildResource(childResource1);
            Resource rootResource = resourceBuilder.build();
            registerResources(rootResource);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String raiseAlarm(Name notification,@PathParam("id") String id) {
        System.out.println("INSIDE RAISE ALARM ");
        System.out.println(notification.toString() + " ID: "+id);
        return "Result";
    }

    public void destroy() {

    }

     public static class Name {

        String firstName;
        String lastName;
        String middleName;

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getMiddleName() {
            return middleName;
        }

        public void setMiddleName(String middleName) {
            this.middleName = middleName;
        }

        @Override
        public String toString() {
            return firstName + " " + middleName + " " + lastName;
        }
    }
}

public void init() {

    Server server = new Server();

    ServletContextHandler context0 = new ServletContextHandler(ServletContextHandler.SESSIONS);
    ServletHolder serveltHolder1 = new ServletHolder(new ServletContainer(new BaseResource()));

    context0.addServlet(serveltHolder1, "/*");
    context0.setVirtualHosts(new String[]{"@external"});
    ServerConnector connector = new ServerConnector(server);
    connector.setHost("localhost");
    connector.setPort(9069);
    connector.setName("external");

    HandlerCollection collection = new HandlerCollection();
    collection.addHandler(context0);
    server.setHandler(collection);
    server.addConnector(connector);


    try {
        server.start();
        server.join();
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
}
上述代码有效。
我想知道一种可以通过编程声明路径参数或查询参数的方法,这样我就可以将我的方法签名定义为raiseAlarm(名称通知,字符串id)并避免@PathParam(“id”)注释。

我知道刚才有人问过这个问题,但我遇到了同样的问题并找到了答案。有关完整的代码,请参见我的问题和自己的答案

必须以与
@path
注释相同的方式添加具有路径的子资源。之后,可以通过上下文的
getUriInfo()
方法获取path参数

如下所示(假设您已经有一个
Resource.Builder
对象):

final Resource.Builder subResourceBuilder=resourceBuilder.addChildResource(“{id}”);
subResourceBuilder.addMethod(“GET”)
.products(MediaType.APPLICATION\u JSON\u类型)
.handledBy(新拐点(){
@凌驾
公共响应应用(ContainerRequestContext rctx){
//获取路径参数
多值Map pparams=rctx.getUriInfo().getPathParameters();
List idValues=pparams.get(“id”);
//在这里创建响应
}
});

你有没有发现这方面的问题?我想做同样的事情。
final Resource.Builder subResourceBuilder = resourceBuilder.addChildResource("{id}");

subResourceBuilder.addMethod("GET")
    .produces(MediaType.APPLICATION_JSON_TYPE)
    .handledBy(new Inflector<ContainerRequestContext, Response>() {

    @Override
    public Response apply(ContainerRequestContext rctx) {
         // Get to the path parameter                    
         MultivaluedMap<String, String> pparams = rctx.getUriInfo().getPathParameters();
         List<String> idValues = pparams.get("id");
         // Create response here
    }
});