Spring Data REST不包括资源中的实体链接 [英] Spring Data REST not including entity links in resource
问题描述
看起来这是Spring 4.2.0中的已知错误,升级到4.2.1提供了预期的功能
Looks like this was a known bug in Spring 4.2.0, upgrading to 4.2.1 has provided the expected functionality
我正在努力将我的开发团队转移到用于Web应用程序的Spring + WebMVC + Data-REST + Data-JPA + Spring HATEOAS。我当前的应用程序只是维护我们正在进行的应用程序列表。
I'm working on moving my dev team over to Spring + WebMVC + Data-REST + Data-JPA + Spring HATEOAS for web applications. My current app is just going to maintain a list of our ongoing applications.
我遇到了我的默认Spring Data REST设置问题。 我的资源未在其特定视图中包含其关联资源,而它们包含在集合视图中。
I'm running into an issue with my default Spring Data REST setup. My resources aren't including their linked resource in their specific views, while they are included in the collection view.
我不确定如果这是预期的行为,那么我将在本文末尾包括相关的配置等。
I'm not sure if this is intended behavior or not, so I'll include relevant configs and such at the end of this post.
jv.local
是我的开发框,
apps-list / app是spring-data-rest绑定的地方(下面包含配置)
jv.local
is my dev box,
apps-list/app is where spring-data-rest is bound to (config included below)
示例:
curl jv.local:8080/apps-list/app/departments
退货:
{
"_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
}
}
} ]
}
}
(特别注意部门在_links中将其机构正确链接)
(Note in particular that departments have their institution linked properly in _links)
然而,拉动特定部门会导致
However, pulling a specific department results in
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中启用该机构?
Here the department has no associated institution listed. Is there a way to enable the institution in _links?
Department.java
@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
}
Institution.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
}
存储库
DepartmentRepository.java
@RestResource(rel="departments",path="departments")
public interface DepartmentRepository extends JpaRepository<Department, Long> {
}
InstitutionRepository.java
@RestResource(rel="institutions",path="institutions")
public interface InstitutionRepository extends JpaRepository<Institution, Long> {
Institution findFirstByName(String name);
}
配置
通过@Imports从根AppConfig类中包含配置。 AppConfig通过 AbstractAnnotationConfigDispatcherServletInitializer
子类指定为 getRootConfigClasses()
的成员。
Configs
Configs are included from a root AppConfig class via @Imports. AppConfig is specified via AbstractAnnotationConfigDispatcherServletInitializer
subclass as a member of getRootConfigClasses()
.
AppConfig类使用以下内容进行注释
AppConfig class is annotated with the following
@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})
RestConfiguration.java
@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {
@Override
public RepositoryRestConfiguration config() {
RepositoryRestConfiguration config = super.config();
config.setBasePath("/app");
return config;
}
}
版本信息
- 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
- 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
Version Information
请!让我知道我是否可以提供更多有用的信息,或者可能是一个有效的GH项目。如果这是预期的行为,有没有办法覆盖,并强制显示链接?
Please! let me know if I can provide any more useful information, or possibly a working GH project. If this is intended behavior, is there any way to override, and force links to display?
感谢您的时间!
推荐答案
这是一个众所周知的 - 幸好已经修复了 - Spring 4.2中的错误。升级到Spring 4.2.1应该修复它(或Spring Boot 1.3 M5)。
That's a well-known – and thankfully already fixed – bug in Spring 4.2. Upgrading to Spring 4.2.1 should fix that (or Spring Boot 1.3 M5).
这篇关于Spring Data REST不包括资源中的实体链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!