使用Spring Rest数据上的RestTemplate(HATEOAS)在对象之间创建关联
我正在努力通过RestTemplate在SpringDataRESTAPI上操作对象(JPA实体) 我有一个树形结构,其中流派的父母和其他流派的孩子(这是) 创建对象很好:使用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
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,这对我帮助不大:)
关于这一点,也有一些问题得到了类似的回答,但大多数问题要么指向不再存在的文档,要么指向那些简单的对象,所有内容都被转储到地图中。查看您发布的少量代码和收到的错误,我想您调用服务的方式是错误的 这里我以第二个调用为例,但由于我认为您在两个调用中都犯了相同的错误,所以第一个错误的解决方案应该是类似的 如果我们查看您正在调用的的的文档,我们可以看到它需要以下参数:
{
"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客户端代码、控制器和一些调试日志吗。几乎没有足够的信息形成摘要。。。。第二,如果您的客户抱怨未知值,我知道该怎么办,但当然我需要看一些代码。我上周确实发现了这一点,您的答案是正确的:)