2015-01-23 4 views
6

Ich mag meine Webservice mit diesem Muster nennen:Jersey: @PathParam mit Komma zur Liste <MyObject>

/resource/1,2,3 

Und in meiner Klasse mag ich eine Liste des Objekts meine Parameter binden

@Path("/resource") 
public class AppWS { 

    @GET 
    @Path("/{params}") 
    public Response get(@PathParam("params") List<MyObject> params) { 
     return Response.status(200).entity("output").build(); 
    } 
} 

Mit einem einfachen Objekt:

public class MyObject { 
    Integer value; 
    public MyObject(Integer value) { 
     this.value = value; 
    } 
} 

nb: Wenn es möglich ich will nicht eine MyObjectList wh erstellen Ich erweitere List (und habe einen Konstruktor, der meine Zeichenkette teilt)

Wie kann ich fortfahren?

+0

Ihr Link ist kaputt. Könnten Sie einfach den Namen des Musters sagen oder es stattdessen erklären? – gla3dr

+0

Hallo gla3dr, thx für die Antwort. Es ist kein echter Link, es ist nur ein Beispiel für URI, das auf die Ressource zugreifen kann. In der Tat, ich möchte Kommas für mehrere Werte im Pfad verwenden (ich bearbeite meinen Beitrag) – Guillaume

+0

Oh, ich verstehe. Ich habe falsch verstanden, was du meintest, mein Schlechter! Die Art, wie Sie es jetzt haben, ist viel klarer. – gla3dr

Antwort

4

Ich bin nicht sicher, wie der Weg 1,2,3.

Wenn Sie darauf bestehen,

private Response get(List<MyObject> params) { 
} 

@GET 
@Path("/{params}") 
public Response get(@PathParam("params") String params) { 

    return get(Stream.of(params.split(",")) 
     .map(MyObject::new) 
     .collect(Collectors.toList())); 
} 

Wenn Sie wirklich darauf bestehen,

Anmerkung,

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.PARAMETER}) 
public @interface MyObjectsParam { 

} 

Konverter,

public class MyObjectsParamDateConverter 
    implements ParamConverter<List<MyObject>> { 

    @Override 
    public List<MyObject> fromString(final String value) { 
     return Stream.of(params.split(",")) 
      .map(MyObject::new) 
      .collect(Collectors.toList()) 
    } 

    @Override 
    public String toString(final List<MyObject> value) { 
     return value.stream() 
      .map(o -> o.getValue()) 
      .map(Object::toString) 
      .collect(Collectors.joining(",")); 
    } 
} 

Anbieter,

@Provider 
public class MyObjectsParamConverterProvider 
    extends ParamConverterProvider { 

    @Override 
    @SuppressWarnings("unchecked") 
    default ParamConverter getConverter(final Class<S> rawType, 
             final Type genericType, 
             final Annotation[] annotations) { 
     for (final Annotation annotation : annotations) { 
      if (MyObjectsParam.class.isInstance(annotation)) { 
       return new MyObjectsParamDateConverter(); 
      } 
     } 

     return null; 
    } 
} 

Jetzt können Sie es so verwenden.

@GET 
@Path("/{params}") // still '1,2,3' 
public Response get(
    @PathParam("params") 
    @MyObjectsParam // IN ACTION!!! 
    List<MyObject> params) { 

}