2012-01-14 3 views
2

Я видел такие вещи, описанные в разных примерах, показывающие, как создать службу REST, которая берет массивы или список объектов как часть URL-адреса.Передача списка или массива в RESTeasy с помощью get

Мой вопрос в том, как реализовать это с помощью RESTeasy? Что-то вроде следующего было бы, как я предполагаю, что это сработает.

@GET 
    @Path("/stuff/") 
    @Produces("application/json") 
    public StuffResponse getStuffByThings(
      @QueryParam("things") List<Thing> things); 

ответ

3

Создайте StringConverter и используйте объект-обертку. Вот быстрый и грязный пример:

public class QueryParamAsListTest { 
public static class Thing { 
    String value; 
    Thing(String value){ this.value = value; } 
} 

public static class ManyThings { 
    List<Thing> things = new ArrayList<Thing>(); 

    ManyThings(String values){ 
     for(String value : values.split(",")){ 
      things.add(new Thing(value)); 
     } 
    } 
} 

static class Converter implements StringConverter<ManyThings> { 

    public ManyThings fromString(String str) { 
     return new ManyThings(str); 
    } 

    public String toString(ManyThings value) { 
     //TODO: implement 
     return value.toString(); 
    } 

} 

@Path("/") 
public static class Service { 
    @GET 
    @Path("/stuff/") 
    public int getStuffByThings(
     @QueryParam("things") ManyThings things){ 

     return things.things.size(); 
    } 
} 



@Test 
public void test() throws Exception { 
    Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); 
    dispatcher.getProviderFactory().addStringConverter(new Converter()); 
    dispatcher.getRegistry().addSingletonResource(new Service()); 

    MockHttpRequest request = MockHttpRequest.get("/stuff?things=a,b,c"); 
    MockHttpResponse response = new MockHttpResponse(); 

    dispatcher.invoke(request, response); 

    Assert.assertEquals("3", response.getContentAsString()); 


} 
} 

Я думаю, вы также можете использовать StringParamUnmarshaller

0

Я имел некоторые удачи с этим, используя Collection, а не List. Я не смог сделать StringConverter для работы List.

@Provider 
public class CollectionConverter implements StringConverter<Collection<String>> { 

    public Collection<String> fromString(String string) { 
    if (string == null) { 
     return Collections.emptyList(); 
    } 
    return Arrays.asList(string.split(",")); 
    } 

    public String toString(Collection<String> values) { 
    final StringBuilder sb = new StringBuilder(); 
    boolean first = true; 
    for (String value : values) { 
     if (first) { 
     first = false; 
     } else { 
     sb.append(","); 
     } 
     sb.append(value); 
    } 
    return sb.toString(); 
    } 
} 

Я сделал toString с головы. Обязательно напишите тесты для проверки. Но, конечно, все проще и понятнее, когда вы используете Guava. Можно использовать Joiner и Splitter. Очень удобно.

0

Просто используйте обертку самостоятельно, не нужно ни для чего другого.

В конечной точке

@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
@Path("/find") 
@GET 
MyResponse find(@QueryParam("ids") Wrapper ids); 

И обертка выглядит следующим образом:

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