Spring HATEOAS客户端忽略空链接-“模板不能为空或为空!”例外

问题描述

我正在访问由第三方提供的HATEOAS API,由于某种原因,我们从他们那里收到的响应包含具有href的空值的链接。这引发了异常。我无法控制此API,因此无法更改响应。有什么办法可以解决这个问题?

以下是JSON的示例:

{
    "_embedded": {
        "example": [{ ... }]
    }
    "_links": {
        "next": {
            "href": null
        },"prev": {
            "href": null
        },"self": {
            "href": "https://bag.basisregistraties.overheid.nl/api/v1/panden"
        }
    }
}

当我使用RestTemplate发出请求时,我收到一个IllegalArgumentException消息,消息为“ Template不能为null或为空!”

Caused by: java.lang.IllegalArgumentException: Template must not be null or empty!
    at org.springframework.util.Assert.hasText(Assert.java:284)
    at org.springframework.hateoas.UriTemplate.<init>(UriTemplate.java:56)
    at org.springframework.hateoas.Link.<init>(Link.java:94)
    at org.springframework.hateoas.hal.Jackson2HalModule$HalLinkListDeserializer.deserialize(Jackson2HalModule.java:583)
    at org.springframework.hateoas.hal.Jackson2HalModule$HalLinkListDeserializer.deserialize(Jackson2HalModule.java:528)
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:369)

我尝试在本地提供此JSON,以便可以从中删除下一个和上一个链接,并且效果很好。我查看了一下代码,但失败了,因为它试图执行new UriTemplate(href),它不接受null作为参数。

我们正在运行Spring Boot版本2.1.8.RELEASE和spring-hateoas版本0.25.2。下面是发出请求的代码:

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION,false);
    Jackson2HalModule jackson2HalModule = new Jackson2HalModule();
    mapper.registerModule(jackson2HalModule);

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes(Arrays.asList("application/json;charset=UTF-8","application/hal+json")));
    converter.setObjectMapper(mapper);

    RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();

    RestTemplate restTemplate = restTemplateBuilder.messageConverters(Collections.singletonList(converter)).build();

    HttpHeaders headers = new HttpHeaders();
    headers.set("Accept","application/json,application/*+json");
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

    HttpEntity<String> entity = new HttpEntity(entity.toString(),headers);

    ParameterizedTypeReference<Resources<Panden>> typeRefDevices = new ParameterizedTypeReference<>() {};
    ResponseEntity<Resources<Panden>> result = restTemplate.exchange(endpoint,HttpMethod.POST,entity,typeRefDevices);;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)