2017-02-21 9 views
0

Я создаю клиента для запроса нашего JSON Api, и я пытаюсь расширить ресурс с помощью контента, поступающего с другого ресурса. Я хочу сделать это, потому что ресурсы являются частью одного и того же объекта, и наши пользователи возвратят единый объект без необходимости отдельно запрашивать две службы. я помещу здесь базовую версию ресурсов, чтобы лучше объяснить проблему:Spring HATEOAS добавляет внешний контент при десериализации JSON

/* Sample class */ 
public class Sample { 

    public String accession; 
    public String name; 
    //... 
    public Map<RelationType, List<Relation>> relations 
    // ... classic getters and setters 
} 

// Relation class 
public class Relation { 
    public String id; 
    // getters and setters 
} 

Теперь JSON Api что-то похожее на это: Здесь Sample

{ 
    "_embedded":{ 
     "samples":[ 
      { 
       "accession":"SAME1500861", 
       "name":"1380435", 
       "_links":{ 
        "self":{  "href":"https://www.ebi.ac.uk/biosamples/api/samples/SAME1500861" 
        }, 
        "sample":{ 
         "href":"https://www.ebi.ac.uk/biosamples/api/samples/SAME1500861" 
        }, 
        "relations":{ 
         "href":"https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861" 
        } 
       } 
      } 
     ] 
    }, 
    "_links":{ } 
} 

Здесь отношения :

{ 
    "accession": "SAME1500861", 
    "_links": { 
    "self": { 
     "href": "https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861" 
    }, 
    "derivedFrom": { 
     "href": "https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861/derivedFrom" 
    }, 
    "derivedTo": { 
     "href": "https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861/derivedTo" 
    }, 
    "externalLinks": { 
     "href": "https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861/externalLinks" 
    }, 
    "recuratedTo": { 
     "href": "https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861/recuratedTo" 
    } 
    } 
} 

Любое предложение было бы замечательным. Спасибо

+0

Поправьте меня, пожалуйста, если я ошибаюсь ... Вы хотите сделать звонок один раз, но иметь полный анализируемый объект json? – mihatel

+0

Нет. Я просто хочу объединить два ресурса JSON в класс Sample во время разбора ресурса Sample JSON. Я думаю, что мне нужно сделать два вызова в любом случае, так как ресурсы разделены. – Kerruba

+1

Я бы использовал метод Gson и call setRelations класса. Пример после разбора – mihatel

ответ

0

Вам просто нужно создать структуру класса Java, которая представляет данные в вашем JSON. Вы можете использовать любого из зрителей онлайн или какого-хромового расширения, чтобы увидеть стриктуры ...

Я только что сделал небольшую часть вашего JSON отношений ...

public class Relations { 

    public String accession; 
    public Links _links; 
} 

public class Links { 
    public Self self; 
} 

public class Self { 
    public String href; 
} 

Здесь, по крайней мере 2 вариант в моих глазах ...

  1. Retrive JSON в виде строки и конвертировать через Gson
  2. Использование весной RestTemplate

В принципе я бы рекомендовал использовать Spring RestTemplate

RestTemplate restTemplate = new RestTemplate(); 

Relations result = restTemplate.getForObject("https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861", Relations.class); 

Или вы можете использовать любую LIB, чтобы получить ответ JSON и конвертировать через Gson

String relationsPart = "{\n" + " \"accession\": \"SAME1500861\",\n" + " \"_links\": {\n" + " \"self\": {\n" + "  \"href\": \"https://www.ebi.ac.uk/biosamples/api/samplesrelations/SAME1500861\"\n" + " }\n" + " }\n" + "}"; 
    Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
    Relations result = gson.fromJson(relationsPart, Relations.class); 
+0

Я уже использую RestTemplate и используя ресурс как объект для извлечения Spring уже умеет моделировать ссылки. Здесь проблема заключается в том, что отношения - это еще один ресурс весной, поэтому мне нужен другой запрос GET для его получения. Но я не знаю, могу ли я заручиться внутри разбора Джексона ресурса Sample, чтобы выполнить второй запрос и получить также Relation Resource. Я боюсь, что ответ на этот вопрос не – Kerruba

+0

Это был мой второй комментарий, почему бы не после разбора. Пример ресурса сделать второй запрос, а затем вызвать метод setRelations? – mihatel

+0

Да, но нет необходимости использовать GSON для этого, если вы используете restTemplate + Spring + Jackson. Я прав? – Kerruba

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