调用api方法抛出resteasy时将List转换为String

时间:2014-03-13 08:40:07

标签: java resteasy

我有接口来映射vk.com api以获取朋友。

@Path("/friends.get")
public interface VkFriendsRequester {

    @GET
    VkFriendsResponse getFriends(
            @QueryParam("user_id") Long userId,
            @QueryParam("order") String order,
            @QueryParam("list_id") Long listId,
            @QueryParam("count") Integer count,
            @QueryParam("offset") Integer offset,
            @QueryParam("fields") Collection<String> fields,
            @QueryParam("name_case") String nameCase,
            @QueryParam("access_token") String accessToken,
            @QueryParam("v") String version,
            @QueryParam("lang") String language
    );
}

这里我有@QueryParam("fields") Collection<String> fields参数。默认情况下,当我在这里传递数组时,RestEasy将其转换为fields=fields1&fields=fields2&fields=fields3...,但vk.com api需要这样的内容:fields=fields1,fields2,fields3...

我发现我需要创建实现StringConverter接口的提供程序。 这是代码

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

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

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

但restesy不会调用此方法。 我试图在web.xml中注册这个提供程序,但这无论如何都没有帮助。

<context-param>
        <param-name>resteasy.providers</param-name>
        <param-value>
            net.wideup.common.rest.DefaultExceptionHandler,
            net.wideup.common.rest.StringCollectionConverter
        </param-value>
    </context-param>

2 个答案:

答案 0 :(得分:0)

查看以下文章:https://docs.jboss.org/resteasy/2.0.0.GA/userguide/html/StringConverter.html

搜索DateFormatter。这个例子正是您所需要的。 作者创建了转换器和一个特殊的自定义注释,用于标记应转换的参数。他将字符串转换为日期,您可以将其转换为List<String>

答案 1 :(得分:0)

我已经测试并调试了你的代码(就像你发布的那样),它完美无缺。请注意

  1. 没有必要将Converter添加到您的web.xml中,它会被自动检测到(至少在我的Java EE环境中)。
  2. 如果1.在您的情况下是正确的,那么请检查您的罐子中是否有另一个StringConverter,它负责类型Collection(无论何种类型的集合,例如{{ 1}}),因为你可能只有一个StringConverter用于原始类型(正如我所注意到的)。
  3. 如果没有任何帮助,请考虑升级您的版本。我使用resteasy-jaxrs-2.3.2(应该在你的环境中部署,检查