2016-01-24 8 views
3

Я пытаюсь создать трикотажные ресурсы программно (без аннотаций). У меня есть метод raiseAlarm, который принимает имя и id в качестве входного параметра. Я хочу взять Name из ввода 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(); 
    } 
    } 
} 

Приведенный выше код работает. Я хочу знать способ, которым я могу программно описать параметры Paraxers или Query, чтобы я мог определить свою подпись метода как raiseAlarm (уведомление о имени, идентификатор строки) и избежать аннотации @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 
    } 
}); 
Смежные вопросы