【发布时间】:2020-01-22 00:55:46
【问题描述】:
我有一个简单的场景,其中 User 和 Skill 之间存在关系, 意味着一个用户有很多技能,所以我尝试了:
用户
@Data
@NoArgsConstructor
@Entity
@EqualsAndHashCode
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@OneToMany(mappedBy = "user")
private List<Skill> skills;
}
技能
@Data
@NoArgsConstructor
@Entity
@EqualsAndHashCode
public class Skill {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String skillTitle;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
}
用户存储库
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
List<User> findByName(@Param("name") String name);
}
技能库
@RepositoryRestResource(collectionResourceRel = "skills", path = "skills")
public interface SkillRepository extends CrudRepository<Skill, Long>{
}
通过以上所有内容,我可以在例如 url http://localhost:8085/users/1 得到响应
{
"name": "Root",
"_links": {
"self": {
"href": "http://localhost:8085/users/1"
},
"user": {
"href": "http://localhost:8085/users/1"
},
"skills": {
"href": "http://localhost:8085/users/1/skills"
}
}
}
问题不是我不知道为什么没有获取技能列表,为什么只获取了这个
"skills": {
"href": "http://localhost:8085/users/1/skills"
}
不是与user/1 相关的技能的完整列表。
更新
按照建议添加投影: 用户投影.java
@Projection(name = "inlineData", types=User.class)
public interface UserProjection {
String getName();
List<Skill> getSkills();
}
UserRepository.java 是
@RepositoryRestResource(collectionResourceRel = "users", path = "users", excerptProjection = UserProjection.class)
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
List<User> findByName(@Param("name") String name);
}
回复是:
{
"name": "Root",
"_links": {
"self": {
"href": "http://localhost:8085/users/1"
},
"user": {
"href": "http://localhost:8085/users/1{?projection}",
"templated": true
},
"skills": {
"href": "http://localhost:8085/users/1/skills"
}
}
}
【问题讨论】:
-
你能把代码贴在你使用 findByUserId() 函数产生这个响应的地方吗?
-
这不就是 HATEOAS 的意义所在吗?点击链接可以看到用户的技能。
-
@CholNhial 单击该链接时不显示任何内容...
-
同样在 API 请求中,您正在发送 user1 但您正在为 user3 发布响应。
-
在第二个示例中,方法的名称是
findByUserId,但您将skillId作为参数传递。没事吧?
标签: java spring-boot spring-data-jpa spring-data-rest