有没有办法在没有Projection的情况下返回具有id的关联对象

时间:2016-10-19 06:03:14

标签: java spring spring-data-rest

我使用的是spring-boot-starter-parent 1.4.1.RELEASE。

  1. Spring boot @ResponseBody默认情况下不会序列化实体ID。
  2. 如果我使用exposeIdsFor返回id,但我需要为每个类

    配置它

    e.g

      

    RepositoryRestConfiguration.exposeIdsFor(User.class);   RepositoryRestConfiguration.exposeIdsFor(Address.class);

    如果没有配置每个实体类,是否有更简单的配置。

    参考:https://jira.spring.io/browse/DATAREST-366

    1. REST资源将该属性呈现为对应关联资源的URI。我们需要返回关联的对象而不是URI。
    2. 如果我使用Projection,它将返回关联的对象,但我需要为每个类配置

      e.g

      @Entity
      public class Person {
      
        @Id @GeneratedValue
        private Long id;
        private String firstName, lastName;
      
        @ManyToOne
        private Address address;
        …
      }
      

      PersonRepository:

      interface PersonRepository extends CrudRepository<Person, Long> {}
      

      PersonRepository返回

      {
        "firstName" : "Frodo",
        "lastName" : "Baggins",
        "_links" : {
          "self" : {
            "href" : "http://localhost:8080/persons/1"
          },
          "address" : {
            "href" : "http://localhost:8080/persons/1/address"
          }
        }
      }
      

      我的预测:

      @Projection(name = "inlineAddress", types = { Person.class }) 
      interface InlineAddress {
      
        String getFirstName();
      
        String getLastName();
      
        Address getAddress(); 
      }
      

      添加投影后,返回..

      {
        "firstName" : "Frodo",
        "lastName" : "Baggins",
        "address" : { 
          "street": "Bag End",
          "state": "The Shire",
          "country": "Middle Earth"
        },
        "_links" : {
          "self" : {
            "href" : "http://localhost:8080/persons/1"
          },
          "address" : { 
            "href" : "http://localhost:8080/persons/1/address"
          }
        }
      }
      

      如果其他一些类具有关联作为地址,那么我还需要为这些类添加投影。

      但我不想为每个课程配置。如何实现动态投影?这样我的所有实体都将返回嵌套对象作为响应。

      参考:https://jira.spring.io/browse/DATAREST-221

2 个答案:

答案 0 :(得分:1)

关于您已回答here的第一个问题,exposeIdsFor接受任意数量的参数。另外,正如提到in this thread如果您的所有实体类都位于同一个包中,您可以使用Reflections library获取类的列表并将其提供给exposeIdsFor()。

答案 1 :(得分:-2)

您不应该将域模型作为响应返回。再添加一层DTO(数据传输对象),并在事务中将域模型转换为dto。