【发布时间】:2014-10-06 16:50:46
【问题描述】:
编辑 14/08/14 13:29
我的下一个结论是我的@RepositoryRestResource CrudRepository 生成的 hal+json 格式不正确。
教程 (http://spring.io/guides/gs/accessing-data-rest/) 将超媒体 Rest JPA 实体的输出显示为:(请注意没有“rel”元素,“links”不是数组)
{
"_links" : {
"people" : {
"href" : "http://localhost:8080/people{?page,size,sort}"
}
}
}
但是,参考文档 (http://docs.spring.io/spring-data/rest/docs/1.1.x/reference/html/intro-chapter.html) 显示输出应该是:
{
"links" : [ {
"rel" : "customer",
"href" : "http://localhost:8080/customer"
}, {
"rel" : "profile",
"href" : "http://localhost:8080/profile"
}
}
有人知道这是为什么吗?
======================================
编辑 14/08/14:我的调试更进了一步。通过提供我自己的 org.springframework.hateoas.ResourceSupport 类的实现,它检查 json 中的“_links”而不是“links”,我更进一步。错误是:
“无法通过引用链将 java.util.ArrayList 实例反序列化出 START_OBJECT 令牌.....:com.ebs.solas.admin.test.SolicitorDTO[\"_links\"]”
这是因为 org.springframework.hateoas.ResourceSupport 类似乎要求 links 属性是一个 json 数组。默认情况下,Spring Data 为 Rest Entity 生成的 json+hal 输出不会生成数组(没有方括号):
"_links" : {
"self" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx"
},
"solicitors" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx/solicitor
}
}
希望来自 Spring 论坛的人可以在这里帮助我。
===============================================
请查看我的 Spring Data 存储库代码大纲:
@RepositoryRestResource
public interface SolicitorFirmRepository extends CrudRepository<SolicitorFirm, String> {
}
@Entity
@RestResource
@Table(name="XXXX", schema = "XXX")
public class SolicitorFirm implements Serializable {
}
这样就成功生成了下面的hateoas资源:
{
"firmNumber" : "FXXXX",
"solicitorType" : "r",
"companyName" : "XXXX",
"address1" : "XXXX",
"address2" : "XXX",
"address3" : "XXX",
"address4" : null,
"phoneNumber" : "XXXXX",
"faxNumber" : "XXXXX",
"county" : "OY",
"_links" : {
"self" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX"
},
"solicitors" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX/solicitors"
}
}
但是,当我为客户端/控制器使用定义 DTO 时:
import org.springframework.hateoas.ResourceSupport;
public class SolicitorFirmDTO extends ResourceSupport {
.....
}
并使用以下代码
RestTemplate rt = new RestTemplate();
String uri = new String("//xxxxx:9090/solas-admin-data-api/solicitors/Sxxxxx");
SolicitorFirmDTO u = rt.getForObject(uri, SolicitorFirmDTO.class, "SXXXX");
我收到以下错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“_links”(com.ebs.solas.admin.test.SolicitorFirmDTO 类),未标记为可忽略(7 个已知属性:xx])
由于某种原因,Spring Data Rest 生成的 json 在 _links 下添加了实体链接,而 HATEOAS 资源超类需要 links?
有人可以帮忙吗?这是版本问题还是我需要一些额外的配置才能将_links 映射到links
我尝试了MappingJackson2HttpMessageConverter 和各种媒体类型application/json+hal 均无济于事。
【问题讨论】:
-
输出是 HAL+JSON 但您的输入只需要 Spring 的 JSON 数据类型。你需要谈谈HAL吗?你在某处有@enablehypermediasupport 注释吗?
-
再次询问..你需要谈谈 HAL 吗?如果你这样做..那么你的客户端解析器需要知道如何反序列化它。
-
对不起,我会更具体。是的,我确实需要 HAL,显然客户端必须能够反序列化 hal+json。如果您查看我发布的代码,那么据我所知,我已经配置/开发了我的客户端代码来做到这一点。它创建一个 Jackson2HalModule 对象映射器、一个 MappingJackson2HttpMessageConverter(带有 application/hal+json 媒体类型集)并在 RestTemplate 对象上配置两者。谢谢
标签: spring rest spring-data spring-data-rest hateoas