收藏AngularJS前端(直接访问) - 春天的数据后台休息(Bookmark AngularJS

2019-10-24 07:31发布

我已经开始实施网络前端处理由提供服务的RESTful服务Spring Data Rest在传统的关系数据库。 这是用做AngularJSangular-hal ,我发现非常适合图书馆HATEOAS的理念和形式主义Spring Data Rest

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

让我们来接触信息库的例子。 如果我从主页开始,然后通过联系人列表浏览,然后选择我想详细可查看联系人,是没有问题的。

但我不能直接访问显示联系人的详细信息的页面:资源是从列表控制器编辑控制器注入,编辑控制器无法知道这个请求的URL,如果不被列表控制器告诉。

问题的根源是,随着Spring Data Rest ,实体对他们的任何公共领域的id (不是JSON),以及库没有API relation通过ID进行搜索。

我想到了一些解决方案,但我不喜欢任何人。

1.工作在后端周围

  • a添加Projection与方法getId()所有实体需要被书签
  • 添加相应的findById()存储库中的接口
  • 使用该ID在前台作为参数(或路径)的网址,并通过调用新的可用的搜索关系解决资源。
  • 缺点 :这迫使我们重新手动所有DTO的春天休息的数据自动生成的,所以我们正在失去的框架的目的之一。
  • :有没有配置Spring自动揭露那些ID字段和findById方法的方法吗?

2.使用自我关系

  • 获取与所述实体的自URI angular-hal $href('self')方法
  • 使用它作为页面的参数,并通过调用一个新的解决资源halClient.$get(resourceUri)就可以了
  • 缺点 :URI应前,把在页面网址,以避免错误beeing后处理由于其他的“http://”在地址栏中。 我想它做一些base64编码的,但是这是耗时。
  • 缺点 :这种公开API URL走向世界,而这个数据可能是至关重要的,需要留隐患(即使这将是通过一个调试器看网络流量访问过)。

3.忘记HATEOAS

  • 不要用关系和发现能力打扰
  • 删除angular-hal ,只需使用$resource与普通的旧网址映射
  • 缺点 :这是倒退,感觉就像没有遵循以下原则...

所以,我失去的东西吗? 什么是关于数据的完整的基于REST的HATEOAS环境的接入的最佳做法是什么?

Answer 1:

我发现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被曝光,从一个共同的抽象类继承

@MappedSuperclass
public abstract class AbstractEntity {

    @Id @GeneratedValue
    Long id;

    public Long getId() {
        return id;
    }

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

该抽象类是由担任@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> {    
}

我想,这使得围绕一个良好的工作,并允许来自客户机的实体中的一个小的价格直接访问



文章来源: Bookmark AngularJS frontend (direct access) - Spring Data Rest backend