我有接口来映射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>
答案 0 :(得分:0)
查看以下文章:https://docs.jboss.org/resteasy/2.0.0.GA/userguide/html/StringConverter.html
搜索DateFormatter
。这个例子正是您所需要的。
作者创建了转换器和一个特殊的自定义注释,用于标记应转换的参数。他将字符串转换为日期,您可以将其转换为List<String>
。
答案 1 :(得分:0)
我已经测试并调试了你的代码(就像你发布的那样),它完美无缺。请注意
StringConverter
,它负责类型Collection
(无论何种类型的集合,例如{{ 1}}),因为你可能只有一个StringConverter用于原始类型(正如我所注意到的)。