REST服务项目结构

时间:2018-08-07 18:20:14

标签: java spring-boot package-structuring

我正在与一位同事一起进行一个项目,他告诉我在创建休息服务时应该创建3个级别。任何人都可以向我解释这是否是“正常”情况,以及我是否以正确的方式使用它?他从不向我解释原因,并在几周后离开公司。

第一级:资源

  

我想这是您捕获请求(GET,POST,PUT等)的地方

第二级:服务

  

在这里进行计算是否有意义?

第三级:存储库

  

他在这里放置了所有与   数据库。

例如假设我们有一个实体“ Employee”,其属性为“ level”。根据您的水平,您会获得不同的奖金。我们要计算奖金并通过REST服务返还。

资源方法看起来像这样:

@GET
@Path("/id/{id}")
@Produces(MediaType.APPLICATION_JSON)
public double findBonusById(@PathParam("id") long id) {
    return employeeService.findBonusById(id);
}

服务方法如下:

public double findBonusById(long id) {
    int level = employeeRepository.findLevelById(id);
    double initialBonus = 2563;
    return level * initialBonus;
}

存储库方法如下所示:

public int findLevelById(long id) {
    return getEntityManager().createNamedQuery("Employee.findLevelById").setParameter("id", id).getSingleResult();
}

2 个答案:

答案 0 :(得分:4)

在您的情况下,这称为分层体系结构

控制器,负责处理请求

@GET
@Path("/id/{id}")
@Produces(MediaType.APPLICATION_JSON)
public double findBonusById(@PathParam("id") long id) {
return employeeService.findBonusById(id);
}

服务是控制器与存储库之间进行通信的层

public double findBonusById(long id) {
int level = employeeRepository.findLevelById(id);
double initialBonus = 2563;
return level * initialBonus;
}

业务,这是可选层,取决于需求,您可以在此层中拥有所有业务逻辑

double initialBonus = 2563;
return level * initialBonus;

存储库,就像您所说的This is where he put all the statements that connect with the Database.

public int findLevelById(long id) {
return getEntityManager().createNamedQuery("Employee.findLevelById").setParameter("id", id).getSingleResult();
 }

答案 1 :(得分:2)

是的,Matthijs,这很正常。在构建任何与Web服务相关的项目时,人们喜欢的是不同的分离“层”。即 layer architecture

  1. 控制器:-您的请求到达的地方。

    @GET @Path("/id/{id}") @Produces(MediaType.APPLICATION_JSON) public double findBonusById(@PathParam("id") long id) { return employeeService.findBonusById(id); }

  2. 服务:-您在其中执行业务逻辑

    public double findBonusById(long id) { int level = employeeRepository.findLevelById(id); double initialBonus = 2563; return level * initialBonus; }

  3. 存储库:-您与数据库进行通信的地方。

    public int findLevelById(long id) { return getEntityManager().createNamedQuery("Employee.findLevelById").setParameter("id", id).getSingleResult(); }

这些是人们通常遵循的一些标准,但是可能会有更多的隔离层。