@ RepositoryRestResource的collectionResourceRel属性未被遵守

时间:2017-06-26 08:43:57

标签: spring-data-mongodb spring-data-rest

我有一个

的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

1 个答案:

答案 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,但我确信它会有用......