首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RestTemplate + Jackson

RestTemplate + Jackson
EN

Stack Overflow用户
提问于 2013-08-20 06:38:01
回答 1查看 32.5K关注 0票数 9

我想使用Spring的RestTemplate和Jackson来使用WebService。我遵循了几个教程,并已经到了创建DAOs的地步。这是获取所有域对象的方法:

代码语言:javascript
复制
// Create a Rest template
RestTemplate restTemplate = new RestTemplate();

// Create a list for the message converters

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();

// Add the Jackson Message converter
messageConverters.add(new MappingJacksonHttpMessageConverter());

// Add the message converters to the restTemplate
restTemplate.setMessageConverters(messageConverters);

List<Station> resultList = Arrays.asList(restTemplate.getForObject(BASE_URL, Station[].class));

return resultList;

但是,我的Web服务并不是立即返回一个Station对象数组,而是以这种方式返回更多的语义表达式:

代码语言:javascript
复制
{"success":true,"message":"Records Retrieved Successfully","data":{"totalCount":"14","stations":[{"id":"1264","station":"Station 1","idJefatura":"1","syncDate":"2013-01-24 13:20:43"}, ...] }}

因此,我的问题是,我不知道如何“告诉”RestTemplate在“站点”指示符之后解析对象列表,而不创建一个临时对象,这似乎不是正确的解决方案。

是否有任何方法为RestTemplate指定正确的语法?

编辑:我创建了这样一个包装对象:

代码语言:javascript
复制
public class RestResponseObject {

    private boolean success;
    private String message;
    private Data data;

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public class Data {
        private int totalCount;
        private List<Station> stations;

        public int getTotalCount() {
            return totalCount;
        }

        public void setTotalCount(int totalCount) {
            this.totalCount = totalCount;
        }

        public List<Station> getStations() {
            return stations;
        }

        public void setStations(List<Station> estaciones) {
            this.stations= estaciones;
        }
    }
}

但是,我很难使这个对象成为通用对象,因为JSON响应中我的对象列表的键名依赖于该域对象的类。

EN

回答 1

Stack Overflow用户

发布于 2013-08-20 06:48:55

这里有两个解决方案:

  1. 您可以编写自己的反序列化器实现,解析JSON,只获取站点列表并将其转换为list对象。反序列化器可以在RestTemplate上设置。看看如何编写杰克逊的自定义反分裂器
  2. 您可以做的另一件事是编写一个类来映射Rest响应。该类应将List对象作为成员变量包含。然后Spring默认情况下将转换为新类,您可以从该类中获取站点。

下面是一个例子。

响应类

代码语言:javascript
复制
public class MyResponseClass {
      // other variables
     private List<Station> stations; //it getters and setters
}

在Rest客户端

代码语言:javascript
复制
MyResponseClass response = restTemplate.getForObject(BASE_URL, MyResponseClass.class)
List<Station> resultList = response.getStations()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18328492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档