使用Spring Rest数据上的RestTemplate(HATEOAS)在对象之间创建关联

使用Spring Rest数据上的RestTemplate(HATEOAS)在对象之间创建关联,spring,resttemplate,spring-data-rest,spring-hateoas,Spring,Resttemplate,Spring Data Rest,Spring Hateoas,我正在努力通过RestTemplate在SpringDataRESTAPI上操作对象(JPA实体) 我有一个树形结构,其中流派的父母和其他流派的孩子(这是) 创建对象很好: URI selfLink = restTemplate.postForLocation(api+"/genre", genre, Collections.emptyMap()); 创建与它的关联并不是那么容易。如果我尝试将父关联设置为如下所示: headers.setContentType(new MediaType("t

我正在努力通过RestTemplate在SpringDataRESTAPI上操作对象(JPA实体)

我有一个树形结构,其中流派的父母和其他流派的孩子(这是)

创建对象很好:

URI selfLink = restTemplate.postForLocation(api+"/genre", genre, Collections.emptyMap());
创建与它的关联并不是那么容易。如果我尝试将父关联设置为如下所示:

headers.setContentType(new MediaType("text", "uri-list"));
...
restTemplate.put(selfLink.toString()+"/parent", entity, parentGenreURI );
headers.setContentType(MediaType.APPLICATION_JSON);
...
Map map = ImmutableMap.of("parent", parentGenreLink);
restTemplate.exchange(selfLink.toString()+"/parent", HttpMethod.PATCH, entity, String.class, map);
我在客户端收到一个500内部服务器错误,但实际的错误在RESTAPI端被忽略了,并且日志中没有任何内容

如果我尝试用父URI修补URI本身,如下所示:

headers.setContentType(new MediaType("text", "uri-list"));
...
restTemplate.put(selfLink.toString()+"/parent", entity, parentGenreURI );
headers.setContentType(MediaType.APPLICATION_JSON);
...
Map map = ImmutableMap.of("parent", parentGenreLink);
restTemplate.exchange(selfLink.toString()+"/parent", HttpMethod.PATCH, entity, String.class, map);
我在客户端和服务器上都收到400个错误请求

org.springframework.http.converter.httpMessageNodeTableException: 无法读取类别类型的对象 从请求中删除!;嵌套异常是 org.springframework.http.converter.httpMessageNodeTableException: 无法读取有效负载!;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:没有要映射的内容 由于输入结束

这让我觉得这是正确的方法,但我只是做错了

有人能提供一些指导吗?我看到的每个示例都使用curl,这对我帮助不大:)


关于这一点,也有一些问题得到了类似的回答,但大多数问题要么指向不再存在的文档,要么指向那些简单的对象,所有内容都被转储到地图中。

查看您发布的少量代码和收到的错误,我想您调用服务的方式是错误的

这里我以第二个调用为例,但由于我认为您在两个调用中都犯了相同的错误,所以第一个错误的解决方案应该是类似的

如果我们查看您正在调用的的的文档,我们可以看到它需要以下参数:

  • 要调用的URL
  • 使用的方法
  • 要作为请求发送的HttpEntity
  • 回答的类别
  • 要在URL中替换的参数值
  • 我认为你错在论点3和论点5。在我看来,您正在尝试发送JSON负载

    {
      "parent": "someGenre"
    }
    
    但是您实际要做的是告诉模板用parentGenreLink的值替换URL中出现的字符串{parent}(URL参数占位符)

    您可能要做的是将映射设置为HttpEntity上的主体,而不是传递任何URL参数:

    // Create the body
    Map map = ImmutableMap.of("parent", parentGenreLink);
    
    // Create the headers
    Headers headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    
    // Create the HTTP Entity
    HttpEntity<?> entity = new HttpEntity<>(map, headers);
    
    // Make the call without any URL parameters
    restTemplate.exchange(selfLink.toString()+"/parent", HttpMethod.PATCH, entity, String.class);
    
    //创建主体
    Map Map=ImmutableMap.of(“父”,parentGenreLink);
    //创建标题
    Headers=新的HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    //创建HTTP实体
    HttpEntity=新的HttpEntity(映射、标题);
    //在不使用任何URL参数的情况下进行调用
    restemplate.exchange(selfLink.toString()+“/parent”,HttpMethod.PATCH,entity,String.class);
    
    请注意,要实现此功能,您必须在模板上设置一个能够(反)序列化JSON的消息转换器:

    RestTemplate restTemplate = new RestTemplate();
    
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    messageConverters.add(new MappingJacksonHttpMessageConverter());
    restTemplate.setMessageConverters(messageConverters);
    
    RestTemplate RestTemplate=new RestTemplate();
    列表>();
    添加(新映射JacksonHttpMessageConverter());
    restemplate.setMessageConverters(messageConverters);
    
    除了@Raniz所建议的,另一种方法是:

    HttpHeaders reqHeaders = new HttpHeaders();
    reqHeaders.add(HttpHeaders.CONTENT_TYPE, new MediaType("text", "uri-list").toString());
    HttpEntity<String> reqEntity = new HttpEntity<String>(category0link.getHref(), reqHeaders);
    ResponseEntity<String> string = template.exchange(widget0link.getHref(),  HttpMethod.PUT, reqEntity, String.class, ImmutableMap.of());
    
    HttpHeaders reqHeaders=新的HttpHeaders();
    添加(HttpHeaders.CONTENT_TYPE,新媒体类型(“文本”,“uri列表”).toString());
    HttpEntity reqEntity=新的HttpEntity(category0link.getHref(),reqHeaders);
    ResponseEntity string=template.exchange(widget0link.getHref(),HttpMethod.PUT,reqEntity,string.class,ImmutableMap.of());
    
    更多的信息,如实体类、控制器类和配置类都很有用,你能发布吗?你能解决你的问题吗?如果是这样的话,您可以通过发布您的解决方案来帮助我们。您可以发布您的rest客户端代码、控制器和一些调试日志吗。几乎没有足够的信息形成摘要。。。。第二,如果您的客户抱怨未知值,我知道该怎么办,但当然我需要看一些代码。我上周确实发现了这一点,您的答案是正确的:)