如何使用Spring Restemplate

时间:2016-04-20 00:31:46

标签: spring-data-rest spring-hateoas

我一直在试图弄清楚如何在我的客户端中简单地启用此类功能以响应HAL + JSON请求。如果我有特定的资源,我可以获取要绑定的属性,但我真的希望href以易于使用的格式,所以我可以懒得获取它们。

Organization [] orgs = restTemplate.getForObject(“http://myservice/organizations”,Organizations [] .class);

组织org = 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();
    }

1 个答案:

答案 0 :(得分:2)

我会尝试从RestTemplate中获取Resources<Resource<Organization>>。外部Resources将包含全局链接,内容中的每个Resource都包含项目链接。

我不会创建自己的ObjectMapper - spring hateoas提供了一个。您的RestTemplate具有可以转换HttpMessageConverter的{​​{1}}非常重要。

本文展示了执行此操作的示例https://dzone.com/articles/spring-resttemplate-linked

目前我无法自己尝试,所以我可以为您提供这些未经考验的想法。