2014-09-18 5 views
2

Я новичок в Spring и следую примеру на http://spring.io/guides/gs/consuming-rest. Я заметил, что они не отображали все элементы JSON с http://graph.facebook.com/pivotalsoftware, поэтому я хотел немного расширить пример. Для этого примера, я хотел бы добавить «любит» и «were_here_count», как и в Page.java: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()); 
    } 
} 

Я думал, что отображение выполнялось по имени элемента, и это работало для «любит», но не для «was_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 

were_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 имен переменных?

Кто-нибудь знает, как это сделать и хочет показать мне, как создать пользовательский конвертер и какие необходимые шаги? Спасибо! :)

ответ

0

Как выглядит ваш сеттер для страницы? Это работает для меня с этим сеттер:

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

Попробуйте добавить некоторые Jackson's annotations к вашему Page классу, чтобы помочь с десериализации JSON. Вы должны быть в состоянии сказать Джексон (который будет обрабатывать сериализации/десериализации из JSON в Spring по умолчанию), какие атрибуты в ответ 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 извилистый или просто не может легко десериализации.

Смежные вопросы