Json 为什么RestTemplate不将响应表示绑定到PagedResources?

Json 为什么RestTemplate不将响应表示绑定到PagedResources?,json,spring,rest,spring-data,spring-data-rest,Json,Spring,Rest,Spring Data,Spring Data Rest,我使用SpringDataREST将实体公开为(分页的)rest资源。一切正常,但当我通过restemplate请求数据时,我得到了一个无用的HATEOAS-JSON(我没有要求)。JSON似乎是一个PagedResources。我可以接受,但是JSON没有正确地转换成对象。里面没有内容 存储库: @RepositoryRestResource(collectionResourceRel = "people", path = "people") public interface PersonRe

我使用SpringDataREST将实体公开为(分页的)rest资源。一切正常,但当我通过
restemplate
请求数据时,我得到了一个无用的HATEOAS-JSON(我没有要求)。JSON似乎是一个PagedResources。我可以接受,但是JSON没有正确地转换成对象。里面没有
内容

存储库:

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


好像
\u embedded
没有正确映射到内容

正如您正确发现的那样,
PagedResources
没有嵌入的
\u
属性,这就是为什么您没有填充
内容
属性的原因

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

  • 首先提供与表示形式匹配的类型。因此,创建一个自定义类,要么坚持表示的属性名称,要么使用Jackson注释等对其进行自定义

  • 设置自定义
    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));
    
    ObjectMapper mapper=new ObjectMapper();
    configure(在未知属性上反序列化feature.FAIL,false);
    registerModule(新Jackson2HalModule());
    MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
    setSupportedMediaTypes(MediaType.parseMediaTypes(“application/hal+json”);
    setObjectMapper(映射器);
    
    RestTemplate=新的RestTemplate(收集。展望未来,你可能想重新思考你在这里提问的方式。如果东西对你没用,不要使用它。请不要声明,如果你明确发出了
    GET
    请求,你就没有要求东西。与计算机一样,你完全得到了你想要的东西。如果你没有指定
    Accept
    标题,你就得到了默认设置是
    application/hal+json
    。一般来说,这种消极的语气不会产生回答的动机。尽管如此,我还是花了时间。不客气。PS:什么是HATEOAS-json,顺便问一下?@Oliver:我承认,我的语气有点消极。但是这些小障碍会让人恼火。当然,我尝试过其他的接受标题,但是结果总是一样的。我不是唯一一个有问题的人:。而且我没有选择使用stuff,我必须这样做。啊,这就是你在客户端解析一个_嵌入列表的方式,告诉RestTemplate期待一个hateoas资源类。非常有用,spring数据rest文档在客户端非常稀疏谢谢你的帮助。选项2看起来不错。但是我得到了模板化的“Unrecognized field”(class org.springframework.hateoas.Link),没有标记为ignorable(一个已知属性:“href”])。我想我必须深入挖掘。如果我不能让它工作,我想我会坚持选项1。我想你可以通过设置
    objectMapper.configure来摆脱这个问题(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    默认情况下Jackson非常严格。相应地更新了答案。嗯,如果我这样做-有什么想法吗?@OliverRotbohm我也有同样的问题,不同的是我没有使用RestTemplate,而是使用了假客户端。我能做什么?
    0 // getContent().size()
    4 // getLinks().size()
    2 // getTotalElements()
    
    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
      }
    }
    
    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));