0

我有一个 REST 服务,它返回如下所示的数据:

[
    { bookmark object json here },
    { bookmark object json here },
    { bookmark object json here },
    ...
]

我的 REST 客户端类如下所示:

@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public BookmarkList getBookmarks(String identifier);
}

书签列表如下所示:

public class BookmarkList {
    List<Bookmark> bookmarks;

    @JsonValue
    public List<Bookmark> getBookmarks() {
        return bookmarks;
    }

    @JsonCreator
    public void BookmarkList(@NotNull List<Bookmark> bookmarks) {
        this.bookmarks = bookmarks;
    }
}

但是,当我使用此设置时,我收到以下错误:

无法读取 JSON:无法从 START_ARRAY 令牌中反序列化 com.whatever.entity.BookmarkList 的实例

我想要的是类似于https://github.com/excilys/androidannotations/wiki/Rest-API#get上的 EventList 示例,但这似乎对我来说开箱即用。

有没有办法让这个工作?

4

2 回答 2

2

嗬...我们必须更新这部分文档。包装器解决方案有效,但不适合 API。

如果您正在查看生成的代码@Get("url") MyReturnedType testService(),您应该会看到如下内容:

return restTemplate.exchange(rootUrl.concat("url"), //
    HttpMethod.GET, //
    null, //
    MyReturnedType.class, //
    urlVariables)//
  .getBody();

返回的类作为调用的参数注入exchange。在泛型集合(如 )的情况下,由于交换方法返回的类型检查List<MyReturnedType>,我们无法注入。List.class

但是,您应该能够在@Rest带注释的方法中使用这个小技巧:

public class BookmarkList extends List<Bookmark> {
}
于 2013-08-11T11:07:05.017 回答
0

我想我误解了https://github.com/excilys/androidannotations/wiki/Rest-API#get上的示例。我认为在该示例中,数组仍然必须包装在 JSON 对象中(如果它们包含示例 JSON 数据会很好)。

我正在连接的服务的数据不会返回一个像这样包装数组的对象,因此,我将 REST 客户端更改为如下所示:

@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public ArrayNode getBookmarks(String identifier);
}

我在另一个类中编写了一个方法来迭代 ArrayNode 并构建书签:

public List<Bookmark> getBookmarks(Content content) {
    ArrayList<Bookmark> bookmarks = new ArrayList<Bookmark>();
    ArrayNode bookmarksData = apiClient.getBookmarks(content.getAcid());

    for(JsonNode bookmarkData : bookmarksData) {
        Bookmark bookmark = objectMapper.convertValue(bookmarkData, Bookmark.class);
        bookmarks.add(bookmark);
    }
    return bookmarks;
}

所以它不是那么方便(我不得不自己编写更多代码),但我让它工作了。

于 2013-08-09T16:34:09.140 回答