以编程方式在Jersey中声明路径参数
我试图以编程方式创建jersey资源(无注释)。 我有一个方法raiseAlarm,它将名称和id作为输入参数。我希望从JSON输入中获取名称,并希望id来自path参数。代码看起来是这样的以编程方式在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(); }
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
}
});