Spring Data REST不包括资源中的实体链接

时间:2015-09-03 22:34:06

标签: java spring spring-mvc spring-data spring-data-rest

由Oliver Gierke的解决方案

解决

看起来这是Spring 4.2.0中的已知错误,升级到4.2.1提供了预期的功能

原始问题

我正致力于将我的开发团队转移到Spring + WebMVC + Data-REST + Data-JPA + Spring HATEOAS for web applications。我目前的应用程序只是维护我们正在进行的应用程序列表。

我遇到了我的默认Spring Data REST设置问题。 我的资源并未在其特定视图中包含其关联资源,而它们包含在集合视图中。

我不确定这是否属于预期的行为,所以我会在本文末尾附上相关的配置等。

curl jv.local:8080/apps-list/app/departments 是我的开发盒, apps-list / app是spring-data-rest绑定的地方(下面包含配置)

示例:

{
  "_links" : {
    "self" : {
      "href" : "http://jv.local:8080/apps-list/app/departments{?page,size,sort}",
      "templated" : true
    }
  },
  "_embedded" : {
    "departments" : [ {
      "name" : "Dining",
      "_links" : {
        "self" : {
          "href" : "http://jv.local:8080/apps-list/app/departments/1",
          "templated" : false
        },
        "institution" : {
          "href" : "http://jv.local:8080/apps-list/app/departments/1/institution",
          "templated" : false
        }
      }
    }, {
      "name" : "Housing",
      "_links" : {
        "self" : {
          "href" : "http://jv.local:8080/apps-list/app/departments/2",
          "templated" : false
        },
        "institution" : {
          "href" : "http://jv.local:8080/apps-list/app/departments/2/institution",
          "templated" : false
        }
      }
    } ]
  }
}

返回:

curl jv.local:8080/apps-list/app/departments/1
{
  "name" : "Dining",
  "_links" : {
    "self" : {
      "href" : "http://jv.local:8080/apps-list/app/departments/1",
      "templated" : false
    }
  }
}

(特别注意部门在_links中将其机构正确链接)

但是,拉出特定部门会导致

@Entity
@Table(name="department")
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="name")
    private String name;

    @ManyToOne(optional = false)
    @JoinColumn(name="institution", referencedColumnName="id")
    @RestResource
    private Institution institution;

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    . . . more getters/setters like above
}

此处部门没有列出相关机构。有没有办法在_links中启用该机构?

实体定义

Department.java

@Entity
@Table(name = "institution")
public class Institution {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name", unique = true)
    private String name;

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    . . . name getter/setter
}

Institution.java

@RestResource(rel="departments",path="departments")
public interface DepartmentRepository extends JpaRepository<Department, Long> {
}

存储库

DepartmentRepository.java

@RestResource(rel="institutions",path="institutions")
public interface InstitutionRepository extends JpaRepository<Institution, Long> {
    Institution findFirstByName(String name);
}

InstitutionRepository.java

AbstractAnnotationConfigDispatcherServletInitializer

CONFIGS

通过@Imports从根AppConfig类中包含配置。 AppConfig通过getRootConfigClasses()子类指定为@Configuration @ComponentScan({my.packages, my.other.packages}) @EnableSpringDataWebSupport @EnableTransactionManagement @EnableJpaRepositories(my.repository.location) @EnableWebMvc @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @Import({PersistenceConfiguration.class, RestConfiguration.class, MvcConfiguration.class, SecurityConfiguration.class})

的成员

AppConfig类使用以下

进行注释
@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {
    @Override
    public RepositoryRestConfiguration config() {
      RepositoryRestConfiguration config = super.config();
      config.setBasePath("/app");
      return config;
    }
}

RestConfiguration.java

{{1}}

版本信息

  • spring-webmvc,4.2.0
  • spring-context,4.2.0
  • spring-orm,4.2.0
  • spring-data-jpa 1.8.2
  • jackson-core 2.6.1
  • jackson-databind 2.6.1
  • servlet 3.1.0
  • spring-data-rest-webmvc 2.3.2
  • spring-hateoas 0.18.0

请!让我知道我是否可以提供更多有用的信息,或者可能是一个有效的GH项目。如果这是预期的行为,有没有办法覆盖,并强制显示链接?

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

这是一个众所周知的 - 幸好已经修复了 - bug in Spring 4.2。升级到Spring 4.2.1应该修复它(或Spring Boot 1.3 M5)。