为什么RestTemplate没有将响应表示绑定到PagedResources?

use*_*584 36 rest spring json spring-data spring-data-rest

我使用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);
}
Run Code Online (Sandbox Code Playgroud)

客户:

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
}
Run Code Online (Sandbox Code Playgroud)

System.out的:

0 // getContent().size()
4 // getLinks().size()
2 // getTotalElements()
Run Code Online (Sandbox Code Playgroud)

卷曲:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

好像_embedded没有正确映射到内容?!

Oli*_*ohm 53

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

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

  1. 提供与首先匹配表示的类型.因此,制作一个自定义类,并坚持表示的属性名称或使用杰克逊注释等自定义它.

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

    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));
    
    Run Code Online (Sandbox Code Playgroud)

  • 我想你可以通过设置`objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);`来简单地摆脱它.杰克逊默认是非常严格的.相应地更新了答案. (3认同)
  • 非常感谢你的帮助.选项2看起来不错.但我得到"未识别的字段"模板"(类org.springframework.hateoas.Link),未标记为可忽略(一个已知属性:"href"])".我想我必须深入挖掘.如果我不能让它工作,我想生病坚持选项1. (2认同)