我有一个
的MongoRepository@RepositoryRestResource(collectionResourceRel = "tools")
public interface ToolRepository extends MongoRepository<Tool, Long>
工具可以是以下两种实现之一:
public class Screwdriver extends Tool
public class Hammer extends Tool
使用@JsonTypeInfo
映射工具@JsonTypeInfo(use =
com.fasterxml.jackson.annotation.JsonTypeInfo.Id.CLASS, include =
As.PROPERTY, property = "_class")
public abstract class Tool
当我执行toolRepository.findAll()
时,会返回JSON响应:
{
"_embedded" : {
"screwdrivers" : [ {
"name" : "Screwdriver",
...
} ],
"hammers" : [ {
"name" : "Hammer",
...
}
}
预期的回应应该是:
{
"_embedded" : {
"tools" : [ {
"name" : "Screwdriver",
...
},
{
"name" : "Hammer",
...
}
}
对于具有Json映射数据的类,不遵守collectionResourceRel
。
进一步调查; PersistentEntitiesResourceMapping.getMetadataFor()
(在Spring中)说要确保如果ResourceMetadata缓存中没有这些子类的工具,那么使用TypeBasedCollectionResourceMapping
会导致每个类在json响应中都有自己的条目。 / p>
有没有办法告诉Spring数据休息一个特定的子类应该绑定到一个特定的存储库,在这种情况下有一种方法告诉Spring数据休息,螺丝刀是ToolRepository
的一部分因此应该使用此存储库的collectionResourceRel
?
答案 0 :(得分:1)
尝试设置这些注释:
@RestResource(rel = "tools", path = "tools")
public abstract class Tool {...}
@RepositoryRestResource(path = "tools", collectionResourceRel = "tools", itemResourceRel = "tool")
public interface ToolRepository extends MongoRepository<Tool, Long> {...}
见工作example。它不是关于Mongo,但我确信它会有用......