json - 为什么 RestTemplate 不将响应表示绑定(bind)到 PagedResou

我正在使用 spring-data-rest 将实体公开为(分页)休息资源。一切正常,但是当我通过 RestTemplate 请求数据时,我得到了一个无用的 HATEOAS JSON(我没有要求)。 JSON 似乎是 PagedResources。我可以忍受,但 JSON 没有正确转换为对象。里面没有content

存储库:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>
{
    List<Person> findByLastName(@Param("name") String name);
}

客户:

public List<Person> getPersons()
{
    RestTemplate rt = new RestTemplate();
    System.out.println(rt.getForObject(URL, PagedResources.class).getContent().size());
    System.out.println(rt.getForObject(URL, PagedResources.class).getLinks().size());
    System.out.println(rt.getForObject(URL, PagedResources.class).getMetadata().getTotalElements());
    return new ArrayList<Person>(rt.getForObject(URL, PagedResources.class).getContent()); // <-- empty
}

系统输出:

0 // getContent().size()
4 // getLinks().size()
2 // getTotalElements()

curl :

C:\...>curl http://localhost:8080/spring-jsf-rest/rest/people
{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/spring-jsf-rest/rest/people{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/spring-jsf-rest/rest/people/search"
    }
  },
  "_embedded" : {
    "people" : [ {
      "firstName" : "John",
      "lastName" : "Rambo",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/spring-jsf-rest/rest/people/1"
        }
      }
    }, {
      "firstName" : "Chuck",
      "lastName" : "Norris",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/spring-jsf-rest/rest/people/2"
        }
      }
    } ]
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}

似乎 _embedded 没有正确映射到内容?!

最佳答案

正如您正确发现的那样,PagedResources 没有 _embedded 属性,这就是您没有填充 content 属性的原因.

这个困境可以通过两种不同的方式来解决:

  1. 首先提供与表示匹配的类型。因此,制作一个自定义类并坚持使用表示的属性名称或使用 Jackson 注释等对其进行自定义。

  2. 设置自定义 MappingJackson2HttpMessageConverter 并自定义 ObjectMapper 以获得 Spring HATEOAS 开箱即用的 Jackson2HalModule 配置。

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.registerModule(new Jackson2HalModule());
    
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
    converter.setObjectMapper(mapper);
    
    RestTemplate template = new RestTemplate(Collections.<HttpMessageConverter<?>> singletonList(converter));
    

关于json - 为什么 RestTemplate 不将响应表示绑定(bind)到 PagedResources?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239052/

相关文章:

json - 如何将 JSON 文件导入 TypeScript 文件?

python - 从文本文件中检索变量值的最佳方法?

ruby-on-rails-3 - 如何使用 ActiveModel::Serializers 为同

java - 如何在 Gson 序列化中保持字段顺序

javascript - 使用 jQuery 检查 JSON 对象中是否存在键

sql - Postgresql 中的 `->>` 和 `->` 有什么区别?

javascript - 有没有一种快速的方法可以在文本编辑器中将 JavaScript 对象转换为

java - Jackson - 反序列化 JSON 字符串 - TypeReference 与 T

java - Jackson @JsonProperty(required=true) 不会抛出异常

javascript - D3.js:使用图像(在数据中指定文件名)作为轴上的刻度值