2016-04-20 6 views
0

Я вытягиваю свои волосы, пытаясь понять, как просто включить эту функцию в моем клиенте в ответ на запрос HAL + JSON. Если у меня есть конкретный ресурс, я могу получить свойства для привязки, но на самом деле хотел бы hrefs в удобном для использования формате, чтобы я мог ленить их.Как просто включить отображение объектов HAL + JSON с Spring Restemplate

Организация [] orgs = restTemplate.getForObject ("http://myservice/organizations", Организации []. Class);

или

Организация орг = restTemplate.getForObject ("http://myservice/organizations/1", Organization.class);

Учитывая следующие HAL и юридические лица:

{ 
    "_embedded": { 
     "af:organizations": [ 
      { 
       "name": "First Company", 
       "description": "Some company", 
       "_links": { 
        "self": { 
         "href": "http://localhost:8080/hal/organizations/1" 
        }, 
        "af:workers": { 
         "href": "http://localhost:8080/hal/organizations/1/workers", 
         "title": "Cancel an order" 
        } 
       } 
      }, 
      { 
       "name": "Second Company", 
       "description": "Someplace we all used to work", 
       "_links": { 
        "self": { 
         "href": "http://localhost:8080/hal/organizations/2" 
        }, 
        "af:workers": { 
         "href": "http://localhost:8080/hal/organizations/2/workers", 
         "title": "All the little ants on your farm" 
        } 
       } 
      } 
     ] 
    }, 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/hal/organizations" 
     }, 
     "profile": { 
      "href": "http://localhost:8080/hal/profile/organizations" 
     }, 
     "curies": [ 
      { 
       "href": "/custom/docs/{rel}.txt", 
       "name": "af", 
       "templated": true 
      } 
     ] 
    } 
} 

объектные

import lombok.AllArgsConstructor; 
import lombok.EqualsAndHashCode; 
import lombok.Getter; 
import lombok.NoArgsConstructor; 

import java.util.List; 

@Getter 
@NoArgsConstructor 
@EqualsAndHashCode 
@AllArgsConstructor 
public class Organization { 

    private String name; 

    private String description; 

    @JsonProperty("_links") 
    private Map<String, Link> links; 

} 

Конфигурация

@Configuration 
@EnablePluginRegistries(RelProvider.class) 
@PropertySource("classpath:ant-farm-client.properties") 
public class AntFarmClientConfig { 

    @Value("${server.url}") 
    private String base; 


    private static final boolean EVO_PRESENT = 
      ClassUtils.isPresent("org.atteo.evo.inflector.English", null); 

    @Autowired 
    private PluginRegistry<RelProvider, Class<?>> relProviderRegistry; 


    @Bean 
    public ObjectMapper jacksonObjectMapper() { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     return objectMapper; 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter jsonConverter() { 
     MappingJackson2HttpMessageConverter jacksonConverter = new 
       MappingJackson2HttpMessageConverter(); 
     jacksonConverter.setSupportedMediaTypes(Arrays.asList(MediaType.valueOf("application/json"))); 
     jacksonConverter.setObjectMapper(jacksonObjectMapper()); 
     return jacksonConverter; 
    } 

    @Bean 
    public CurieProvider curieProvider() { 
     return new DefaultCurieProvider("af", new UriTemplate("http://schema.org/{rel}")); 
    } 


    @Bean 
    MessageSourceAccessor accessor(ApplicationContext context) { 
     return new MessageSourceAccessor(context); 
    } 
    @Bean 
    public RestOperations template(ObjectMapper mapper,MappingJackson2HttpMessageConverter halConverter) { 
     RestTemplate restTemplate = new RestTemplate(); 

     DefaultUriTemplateHandler handler = new DefaultUriTemplateHandler(); 
     handler.setBaseUrl(base); 
     restTemplate.setUriTemplateHandler(handler); 

     restTemplate.getMessageConverters().add(halConverter); 
     return restTemplate; 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter halConverter(MessageSourceAccessor accessor) { 
     CurieProvider curieProvider = curieProvider(); 

     RelProvider relProvider = new DelegatingRelProvider(relProviderRegistry); 
     ObjectMapper halObjectMapper = new ObjectMapper(); 

     halObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 

     halObjectMapper.registerModule(new Jackson2HalModule()); 
     halObjectMapper.setHandlerInstantiator(new 
       Jackson2HalModule.HalHandlerInstantiator(relProvider, curieProvider,accessor)); 

     MappingJackson2HttpMessageConverter halConverter = new MappingJackson2HttpMessageConverter(); 
     halConverter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON)); 
     halConverter.setObjectMapper(halObjectMapper); 

     return halConverter; 
    } 

    @Bean 
    RelProvider defaultRelProvider() { 
     return EVO_PRESENT ? new EvoInflectorRelProvider() : new DefaultRelProvider(); 
    } 

    @Bean 
    RelProvider annotationRelProvider() { 
     return new AnnotationRelProvider(); 
    } 
+0

Просто, чтобы прояснить: вы хотите получить доступ к списку ссылок из экземпляра _Organization_, это так? –

+0

С тех пор я сделал изменения, чтобы получить это. Я хотел бы использовать Jayway, чтобы уменьшить его. Я буду обновлять код с изменениями. –

ответ

2

Я хотел бы попробовать (это моя третья попытка это только мой текущий один.) чтобы получить Resources<Resource<Organization>> из RestTemplate. Внешний Resources будет содержать глобальные ссылки, и каждый из Resource в содержимом содержит ссылки на элементы.

Я бы не создал свою собственную ObjectMapper - пружинная ненависть обеспечивает ее. Просто важно, чтобы ваш RestTemplate имел HttpMessageConverter на месте, который может конвертировать application/hal+json.

В данной статье приведен пример для этого https://dzone.com/articles/spring-resttemplate-linked

В настоящее время я не могу попробовать это сам, так что я могу просто предоставить вам эти непроверенные мысли.

+0

Ваши комментарии на деньги. Сейчас я иду по этой дороге и пытаюсь понять, как лучше использовать API. Я также переваривал это: http://docs.spring.io/spring-hateoas/docs/current/reference/html/ Тем не менее, я пытаюсь выяснить, как заставить его работать, когда я разрешаю копирование документации , –

+0

Когда я расширяю «ResourceSupport», у уже есть «ссылки», на самом деле я их не собираю. –

+0

Как я уже сказал - я просто догадывался - но если у вас есть случай воспроизведения на github, я был бы счастлив попробовать одно или другое –

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