2016-01-24 32 views
3

我試圖以編程方式創建球衣資源(沒有註釋)。 我有一個方法raiseAlarm需要一個名稱和ID作爲輸入參數。我想從JSON輸入中取名,並且我希望id來自路徑參數。代碼看起來像這樣...以編程方式在Jersey中聲明路徑參數

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(); 
    } 
    } 
} 

上述代碼的作品。 我想知道一種方法,我可以以編程方式聲明Path參數或Query參數,以便我可以將我的方法簽名定義爲raiseAlarm(Name notification,String id)並避免@PathParam(「id」)註釋。

+0

你有沒有弄清楚什麼出來呢?我想要做同樣的事情。 – kylejmcintyre

回答

0

我知道這是前一段時間問過的,但我遇到了同樣的問題並找到了答案。查看我的問題和自己的回答here獲取完整的代碼。

您必須以與@Path註釋相同的方式添加路徑的子資源。之後,您可以通過上下文的getUriInfo()方法獲取路徑參數。

像這樣(假設你已經有一個Resource.Builder對象):

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 
    } 
});