Spring RestTemplate自定义映射

Spring RestTemplate自定义映射

问题描述:

我是Spring的新手,沿着http://spring.io/guides/gs/consuming-rest的示例。 我注意到他们没有映射http://graph.facebook.com/pivotalsoftware中的所有JSON元素,所以我想稍微扩展一下这个例子。对于这个例子,我想在Page.java添加“喜欢”和“were_here_count”,就像这样:Spring RestTemplate自定义映射

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Page { 

    private String name; 
    private String about; 
    private String phone; 
    private String website; 
    private int were_here_count; 
    private int likes; 

    public String getName() {return name;} 
    public String getAbout() {return about;} 
    public String getPhone() {return phone;} 
    public String getWebsite() {return website;} 
    public int getVisitCount() {return were_here_count;} 
    public int getLikes() {return likes;} 
} 

,使这些变化在Application.java:

import org.springframework.web.client.RestTemplate; 

public class Application { 

    public static void main(String args[]) { 
     RestTemplate restTemplate = new RestTemplate();     
     Page page = restTemplate.getForObject("http://graph.facebook.com/pivotalsoftware", Page.class); 
     System.out.println("Name: " + page.getName()); 
     System.out.println("About: " + page.getAbout()); 
     System.out.println("Phone: " + page.getPhone()); 
     System.out.println("Website: " + page.getWebsite()); 
     System.out.println("Visit count: " + page.getVisitCount()); 
     System.out.println("Likes: " + page.getLikes()); 
    } 
} 

我在想,该映射是通过元素名称完成的,并且适用于“喜欢”,但不适用于“are_here_count”。输出:

Name: Pivotal 
About: Pivotal is enabling the creation of modern software applications that leverage big & fast data – on a single, cloud independent platform. 
Phone: (650) 286-8012 
Website: http://www.pivotal.io 
Visit count: 0 
Likes: 1175 

are_here_count目前在60.我猜默认转换器不喜欢变量名中的下划线。所以我使用了getForObject的重载版本,提供了我自己的映射,如下所示:

package hello; 

import java.util.HashMap; 
import java.util.Map; 
import org.springframework.web.client.RestTemplate; 

public class Application { 

    public static void main(String args[]) { 
     RestTemplate restTemplate = new RestTemplate(); 
     Map<String, String> variables = new HashMap<String, String>(3); 
     variables.put("name", "name"); 
     variables.put("about", "about"); 
     variables.put("phone", "phone"); 
     variables.put("website", "website"); 
     variables.put("were_here_count", "were_here_count"); 
     variables.put("likes", "likes"); 

     Page page = restTemplate.getForObject("http://graph.facebook.com/pivotalsoftware", Page.class, variables); 
     System.out.println("Name: " + page.getName()); 
     System.out.println("About: " + page.getAbout()); 
     System.out.println("Phone: " + page.getPhone()); 
     System.out.println("Website: " + page.getWebsite()); 
     System.out.println("Visit count: " + page.getVisitCount()); 
     System.out.println("Likes: " + page.getLikes()); 
    } 
} 

但都无济于事。我在这里看到了一些关于自定义JSON转换器的例子,但是他们并没有很好地理解它们 - 此外,这是一个更简单的例子,我能否通过变量名称的简单String-String映射来完成这项工作?

任何人都知道如何做到这一点,并愿意告诉我如何构建自定义转换器,以及必要的步骤是什么?谢谢! :)

你的页面setter是什么样的?它为我这个二传:

public void setWere_here_count(int were_here_count) { 
    this.were_here_count = were_here_count; 
} 

尝试增加一些Jackson's annotationsPage类来帮助与JSON的反序列化。你应该能够告诉杰克逊(将默认处理JSON序列化/反序列化春),在响应JSON地图什么属性你的POJO属性:

public class Page { 
    ... 
    @JsonProperty("were_here_count") 
    private int wereHereCount; 
    ... 
} 

另一种选择,如果你不知道正在返回什么属性,是刚刚的JSON映射到Map

Map<String,Object> map = restTemplate.getForObject("http://graph.facebook.com/pivotalsoftware", Map.class); 
for (Map.Entry entry: response.entrySet()){ 
    // do stuff... 
} 

有时这是做自定义对象映射时的响应JSON是令人费解的,或只是不容易反序列化更简单的方法。