我的下一个结论是,由我的@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类似乎要求链接属性是一个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: Unrecognized field "_links" (class com.ebs.solas.admin.test.SolicitorFirmDTO),这个字段没有被标记为可忽略的(已知有7个属性:xx])
由于某种原因,Spring Data Rest 生成的 json 将实体链接添加在 "_links" 下,而 HATEOAS 资源超类却期望 "links"?
是否有人可以帮助解决问题?这是一个版本问题还是我需要一些额外的配置来将 "_links" 映射到 "links" 呢?
我尝试过 MappingJackson2HttpMessageConverter 和各种媒体类型 application/json+hal,但都无法解决问题。