Bookmark AngularJS 前端(直接访问)- Spring Data Rest 后端

Bookmark AngularJS frontend (direct access) - Spring Data Rest backend

我已经开始实施 Web 前端来操纵 Spring Data Rest 通过传统关系数据库提供的 RESTful 服务。这是用 AngularJS 完成的,我发现 angular-hal 库非常适合 Spring Data RestHATEOAS 哲学和形式主义。

例如,我只需要知道第一个 API 端点('/'),然后我的所有查询都通过关系完成,而不关心 url。 我遇到的问题是能够直接访问显示我的实体之一的页面。

让我们以联系人存储库为例。如果我从主页开始,然后浏览联系人列表,然后选择我想详细查看的联系人,就没有问题。

但我无法直接访问显示联系人详细信息的页面:资源从列表控制器注入到编辑控制器,而编辑控制器无法知道 url如果列表控制器未告知则请求。

根本问题是,对于 Spring Data Rest,实体的 id(不在 JSON 中)没有 public 字段,并且存储库没有 API relation 按id搜索。

我想过一些解决方案,但我都不喜欢。

1.在后端解决

2。使用自我关系

3。忘掉 HATEOAS

那么,我是不是漏掉了什么?关于在完整 RESTFul HATEOAS 环境中访问数据的最佳做法是什么?

我找到了 exposeIdsFor 方法,可以在 JSON 中添加用 @Id 注释的字段。

@Configuration
public class RepositoryConfiguration  extends SpringBootRepositoryRestMvcConfiguration {

    /**
     * add here the main resources that would need direct access from outside
     */
    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Contact.class, User.class);
    }
}

然后我让所有我希望 id 公开的实体继承自一个公共抽象 class

@MappedSuperclass
public abstract class AbstractEntity {

    @Id @GeneratedValue
    Long id;

    public Long getId() {
        return id;
    }

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

此摘要 class 由 @NoRepositoryBean 存储库提供

@NoRepositoryBean
public interface AbstractEntityRepository<T extends AbstractEntity> extends JpaRepository<T, Long> {    
    @RestResource(rel = "byId")
    T findById(@Param("id") Long id);
}

然后我可以为我关心的实体公开 id 和方法 byId() :

@Entity
public class Contact extends AbstractEntity {

    @Column 
   String name;

    @Column 
    String email;
}

public interface ContactRepository extends AbstractEntityRepository<Contact> {    
}

我认为这是一个很好的解决方法,允许以较低的价格从客户端直接访问实体