Джерси: @PathParam с запятыми в List‹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;
    }
}

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

Как я могу действовать?


person Guillaume    schedule 23.01.2015    source источник
comment
Ваша ссылка не работает. Не могли бы вы просто сказать название шаблона или объяснить его вместо этого?   -  person gla3dr    schedule 24.01.2015
comment
Привет, gla3dr, спасибо за ответ. Это не настоящая ссылка, это просто пример uri, который может получить доступ к ресурсу. На самом деле, я хочу использовать запятые для нескольких значений в пути (я редактирую свой пост)   -  person Guillaume    schedule 24.01.2015
comment
Ага, понятно. Я неправильно понял, что вы имели в виду, мой плохой! То, как у вас это есть сейчас, намного понятнее.   -  person gla3dr    schedule 24.01.2015
comment
Нп! Это я. я уточнил свой пост   -  person Guillaume    schedule 24.01.2015
comment
Привет. Это действительно должно быть /resource/1,2,3. Разве это не может быть что-то вроде resource?1,2,3? QueryParam определенно принимает более одного аргумента, хотя вы бы не написали его так (обычно это будет что-то вроде resource?id=1,id=2,id=3). Надеюсь, поможет.   -  person lrnzcig    schedule 24.01.2015
comment
Хороший вопрос! Наверняка resource/1,2,3 будет получено как List‹String› на сервере, но все параметры находятся в одном и том же элементе. (т. е. ожидаемое list.get(0) = 1, list.get(1) = 2, list.get(2) = 3, но на самом деле list.get(0) = 1,2,3.) И ответ Джина Коуна содержит обходной путь. Ваш вопрос и ответ на него сэкономили мое время, спасибо!   -  person tkhm    schedule 13.12.2017
comment
это хорошая практика проектирования API для отдыха, чтобы иметь параметры пути в виде списка?   -  person theprogrammer    schedule 06.02.2020


Ответы (1)


Я не уверен, как 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
    implements 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) {

}
person Jin Kwon    schedule 24.09.2015