2015-01-23 2 views
6

Я хотел бы назвать свою WebService с этим рисунком:Джерси: @PathParam запятыми в список <MyObject>

/resource/1,2,3 

И в моем классе я хочу, чтобы связать свои параметры в список объектов

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

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

с помощью простого объекта:

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

Примечание: Если это возможно, я не хочу, чтобы создать MyObjectList ВГ ich расширяет список (и имеет конструктор, который разделяет мою строку)

Как я могу продолжить?

+0

Ваша ссылка сломана. Не могли бы вы просто назвать имя шаблона или объяснить его? – gla3dr

+0

Hi gla3dr, thx для ответа. Это не настоящая ссылка, это всего лишь пример uri, который может получить доступ к ресурсу. На самом деле, я хочу использовать запятые для нескольких значений в пути (я редактирую свой пост) – Guillaume

+0

О, я вижу. Я неверно истолковал, что вы имели в виду, мой плохой! То, как у вас сейчас, намного яснее. – gla3dr

ответ

4

Я не уверен, путь 1,2,3.

Если вы настаиваете,

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

Если вы действительно настаиваете,

аннотаций,

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

} 

конвертер,

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

поставщик,

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

Теперь вы можете использовать его следующим образом.

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

} 
Смежные вопросы