1
"_embedded": {
"employees": [
    {
        "id": "1",
        "name": "Some Employee",
        "_links": {
            "self": {
                "href": "http://localhost:8080/employees/1"
            }
        }
    },
    {
        "id": "2",
        "name": "Some Employee",
        "_links": {
            "self": {
                "href": "http://localhost:8080/employees/2"
            }
        }
    },
    {
        "id": "3",
        "name": "Some Employee",
        "_links": {
            "self": {
                "href": "http://localhost:8080/employees/3"
            }
        }
    }
]
},
{
"_links": {
    "self": {
        "href": "http://localhost:8080/employees{?page,size,sort}"
    },
    "search": {
        "href": "http://localhost:8080/employees/search"
    }
},
"page": {
    "size": 20,
    "totalElements": 3,
    "totalPages": 1,
    "number": 0
}
}

I'm reading a third-party Rest service that returns json content with the above structure or similar (content-type is application/json).

Currently, I created a custom json converter to a generic object that has custom objects for links,pages and a generic type for the embedded object. So that, I read it in some sort of generic way. However, I would like to do it via hateoas objects. I tried several approaches but any of them are working.

Following others questions I tried many things like configuring the RestTamplate

@Bean
public OAuth2RestTemplate getOAuth2Rest() {

 [...]

    OAuth2RestTemplate template = new OAuth2RestTemplate(resourceDetails, clientContext);
    List<HttpMessageConverter<?>> existingConverters = template.getMessageConverters();
    List<HttpMessageConverter<?>> newConverters = new ArrayList<>();
    newConverters.add(getHalMessageConverter());
    newConverters.addAll(existingConverters);
    template.setMessageConverters(newConverters);       

    return template;
}



private HttpMessageConverter getHalMessageConverter() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.registerModule(new Jackson2HalModule());
    MappingJackson2HttpMessageConverter halConverter =
            new TypeConstrainedMappingJackson2HttpMessageConverter(ResourceSupport.class);
    halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON));
    halConverter.setObjectMapper(objectMapper);
    return halConverter;
}

Then

    ResponseEntity<Resources<MyDto>> entity = restTemplate.exchange(
            myUri,
            HttpMethod.GET, null,
            new ParameterizedTypeReference<Resources<MyDto>>() {},  Collections.emptyMap());

There are similar questions like Consuming Spring Hateoas Pageable but they are consuming json+hal content. I think here is my problem because the deserializer uses the json converter and not the hal converter.

I tried

@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)

Didn't work and interferes with my REST configuration.

I tried this blog

Henry
  • 785
  • 9
  • 17

0 Answers0