我正在使用Spring Boot 2.0.3,Spring Data REST,Spring HATEOAS。 我的域模型相当结构化,但最近我发现自链接中存在奇怪的行为。
我将展示模型的一部分以指出问题,并删除无用的部分:
视力检查:
@EntityListeners(value = EyeExamListener.class)
public class EyeExam extends AbstractEntity {
@NotNull
@JoinColumn(name = "contact_id", updatable = false)
@JsonDeserialize(using = ContactUriDeserializer.class)
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private Contact contact;
@NotNull
@Column(nullable = false, columnDefinition = "DATE")
private Instant date;
联系方式:
@EntityListeners({ContactListener.class})
public class Contact extends AbstractEntity {
@NotNull
@Enumerated(EnumType.STRING)
@Column(nullable = false, columnDefinition = "VARCHAR(30) DEFAULT 'CUSTOMER'")
private ContactType type = ContactType.CUSTOMER;
@NotNull
@Enumerated(EnumType.STRING)
@Column(nullable = false, columnDefinition = "VARCHAR(30) DEFAULT 'NATURAL_PERSON'")
private PersonType personType = PersonType.NATURAL_PERSON;
private String firstName;
private String lastName;
private String companyName;
这是 ContactRepository :
@Transactional
@PreAuthorize("isAuthenticated()")
public interface ContactRepository extends JpaRepository<Contact, Long> {
....
....
}
当我检索特定的EyeExam资源(https://myserver.com/api/v1/eyeExams/13)时,Spring返回:
{
"sid" : "f16d6e45-477f-11e9-898e-9d6f4f2f5990",
"createdBy" : "system",
"createdDate" : "2017-05-31T17:38:00Z",
"lastModifiedDate" : null,
"lastModifiedBy" : null,
"createdByName" : "System",
"lastModifiedByName" : null,
"date" : "2017-05-31T00:00:00Z",
"_links" : {
"self" : {
"href" : "https://myserver.com/api/v1/eyeExams/13"
},
"eyeExam" : {
"href" : "https://myserver.com/api/v1/eyeExams/13{?projection}",
"templated" : true
},
"supplyTypes" : {
"href" : "https://myserver.com/api/v1/eyeExams/13/supplyTypes"
},
"changeStatus" : {
"href" : "https://myserver.com/api/v1/eyeExams/13/changeStatus?status=%7Bstatus%7D"
},
"contact" : {
"href" : "https://myserver.com/api/v1/eyeExams/13/contact{?projection}",
"templated" : true
},
"store" : {
"href" : "https://myserver.com/api/v1/eyeExams/13/store{?projection}",
"templated" : true
}
}
}
如您所见,我获得了链接资源联系人的链接。没关系。现在我得到了资源https://myserver.com/api/v1/eyeExams/13/contact,Spring答复:
{
"sid" : "4c2ba300-477e-11e9-898e-9d6f4f2f5990",
"createdBy" : "system",
"createdDate" : "2018-11-01T09:00:00Z",
"lastModifiedDate" : null,
"lastModifiedBy" : null,
"createdByName" : "System",
"lastModifiedByName" : null,
"type" : "CUSTOMER",
"personType" : "NATURAL_PERSON",
"firstName" : "John",
"lastName" : "Smith",
"companyName" : null,
"_links" : {
"self" : {
"href" : "https://myserver.com/api/v1/contact/22352"
},
"contact" : {
"href" : "https://myserver.com/api/v1/contact/22352{?projection}",
"templated" : true
},
"notes" : {
"href" : "https://myserver.com/api/v1/contacts/22352/notes"
},
"auditLogs" : {
"href" : "https://myserver.com/api/v1/contacts/22352/auditLogs"
},
"media" : {
"href" : "https://myserver.com/api/v1/contacts/22352/media"
},
"privacyAgreements" : {
"href" : "https://myserver.com/api/v1/contacts/22352/privacyAgreements"
},
"eyeExams" : {
"href" : "https://myserver.com/api/v1/contacts/22352/eyeExams"
},
"eyeExamsCount" : {
"href" : "https://myserver.com/api/v1/contacts/22352/eyeExams/count"
},
"documents" : {
"href" : "https://myserver.com/api/v1/contacts/22352/documents"
},
"pendingSalesOrders" : {
"href" : "https://myserver.com/api/v1/contacts/22352/pendingSalesOrders"
},
"lastPurchasedFrames" : {
"href" : "https://myserver.com/api/v1/contacts/22352/lastPurchasedFrames"
},
"store" : {
"href" : "https://myserver.com/api/v1/contact/22352/store{?projection}",
"templated" : true
}
}
}
我想指出自我联系。这是错误,实际上它应该是 https://myserver.com/api/v1/contacts/22352 ,以-s结尾。
我正在使用一些自定义的ResourceProcessor,但是即使没有它们,我也有同样的问题。
现在,我在ContactResourceProcessor中创建了一种变通方法,用正确的链接重写了自我链接,但是我想了解我是在做错什么,是错误还是只是错过了什么。
答案 0 :(得分:0)
可能是一个错误,但是请尝试以下解决方法:
@RepositoryRestResource(path="contacts")
@Transactional
@PreAuthorize("isAuthenticated()")
public interface ContactRepository extends JpaRepository<Contact, Long> {
....
....
}