面向Java初学者的RESTful服务的结构


12

就Java Web开发技能而言,我相对较新。我有一个项目,根据我对API的了解,我认为该项目可以很好地成为RESTful服务的候选人。我正在尝试了解应该如何构造的详细信息,但在谷歌搜索和阅读已有资料方面并没有真正涉足。我希望根据我对该主题的知识和假设,这篇文章能够带来一些验证和/或重定向。

我目前的假设是我的RESTful服务将具有以下结构:

  • 数据库数据(SQL)。
  • 一个ORM(我使用的是相对不受欢迎的ORM,称为CPO,但是对于大多数人来说,它只会被Hibernate取代)。
  • 一个Java管理器类,其方法与ORM进行对话以获得数据
  • 一个Java控制器类,用于处理请求映射,并用于@ResponseBody通过HTTP谓词来指导/处理URL和如何处理数据的动作(http://mysite.com/computers/dell可能GET带有单词“ dell”的请求URL中的参数是一个参数,该参数将返回有关Dell计算机的信息的JSON数组)。
  • 该服务应使用Spring Boot进行,或者以某种方式能够独立存在并且独立于任何其他应用程序。

现在假设以上内容是正确的,那么我将(在非常基本的水平上)拥有一个RESTful服务,任何应用程序都可以使用该服务来使用和使用数据。

所以说我有了我的Web应用程序。假设我正在制作一个有关计算机硬件信息的Web应用程序,而我正在使用Spring来构建此Web应用程序。这是我的假设:

  • 作为JSP,我会有很多看法,而这些JSP包含HTML,CSS和JavaScript。JavaScript将根据需要处理对此应用程序控制器的AJAX调用(如下)。
  • 该Web应用程序还将拥有自己的控制器来处理应用程序的URL请求和路由,然后该控制器将使用该ModelAndView对象或类似的东西与RESTful服务的控制器“对话”,获取正在传递的任何数据,然后将该数据传递回视图(JavaScript,JSP等)进行显示。

我在这里吗?我知道RESTful服务也有一个身份验证方面,但是从概念上讲我还不存在(我的项目将在专用网络中使用,因此此时安全性不是优先事项)。

非常感谢任何见解,批评,知识,反馈或澄清。

Answers:


19

这是我最喜欢的Spring Rest应用程序启动结构示例之一。

1.分层,每一层都是一个单独的模块/项目

  • REST API
    • 打包为war(如果将嵌入式服务器与Spring Boot一起使用,则可能是jar。Springboot doc清楚地说明了如何部署所谓的uber jar。这非常简单。)
    • 它具有处理请求/响应的其余控制器
    • 取决于下面的服务模块
  • 服务
    • 包装为罐子
    • 业务逻辑抽象,这一层不知道如何与数据源进行通信。
    • 它将自动连接到其余控制器中
    • 取决于下面的DAO /存储库模块
  • DAO /存储库
    • 包装为罐子
    • 直接与数据源对话,具有通常称为CRUD的操作。它可以是简单的jdbc,JPA甚至文件访问。
    • 取决于下面的模块
    • 包装为 罐子
    • 它具有您的域模型,通常是POJO类。如果您使用的是ORM,则它们是ORM实体。
    • 它还可能具有DTO(数据传输对象),目前仍在争论中。是否使用它是您的电话。
  • 您可以添加更多模块,例如实用程序,第三方集成等。但是强烈建议您使用上述模块。

2.构建/依赖管理工具(非常需要恕我直言)

有很多,谷歌搜索会显示给你。我个人喜欢Spring的Maven。它仅适用于以上项目结构。
还要注意,如果您使用的是maven,则有一个父模块来聚合第1节中讨论的所有模块。所有的项目符号模块也都对应于maven模块。

3.对您特定项目的想法

由于您使用的是REST,因此我强烈建议您不要将JSP用作视图。您可以使用纯HTML5 + Javascript或一些流行的框架(例如AngularJS)作为视图。
如果您坚持使用JSP,则需要引入另一个包含控制器和JSP的战争(Web应用程序)。控制器将获取数据(通常为Json / xml格式),然后将其解析为模型(POJO),以便您的JSP可以从控制器中获取它们并进行显示。从JSP发布数据是相反的,在此省略。

由于该主题非常庞大且在很大程度上取决于您的特定要求,因此它离完整的指南还差得远。但是,此处包含的术语足以让您进行其他研究(Google确实如此)。希望这会给您一些有关方法的想法。


1
域通常是包含业务逻辑的层。域通常也称为包含服务的层。域对象不是普通的POJO,域对象应包含业务逻辑,例如参数验证等。将图层重命名为其他名称可能会更好。存储库层也经常用于将数据从多个源传输到您的域对象。
安迪

服务和存储库模块也将是Spring项目吗?
Glenn Van Schil's

1
@GlennVanSchil不,构建整个项目时不必是Spring项目b / c,回购/服务层将包含在类路径中。结果@Autowire将起作用。
Minjun Yu

@MinjunYu感谢您的明确答案!但是您的repo / service确实需要Spring作为Service,Repository或Component批注的Maven依赖关系,对吗?
Glenn Van Schil's

1
@GlennVanSchil如果将所有Spring Maven依赖项放在父模块的pom.xml中,则无需在子模块(仓库/服务模块)中添加任何与Spring相关的依赖项。这只是在春季布置多模块项目的一种方法。目的是组织您的代码。如果您的项目规模不大,并且在可预见的将来不会改变,则可以将域,仓库,服务合并到一个称为“核心”的模块中。看起来更干净。
Minjun Yu

2

在同意@ Minjun.Y的大多数答案的同时,我认为我将对REST和Web页面层采取稍微不同的方法。通过阅读您的问题,我认为您想将Web界面和REST界面公开给外界。从数据库中读取POJO,将数据转换为JSON,然后再转换为POJO以供JSP使用,几乎没有什么收获。

我希望使服务层能够完成所有实际工作,并为Web应用程序(JSP)和REST控制器添加单独的“表示”层。这些将是单独的控制器,服务将被注入到这些控制器中。或者,仅使用REST服务,并按照前面的答案在客户端上构建所有表示逻辑。

另外,我也不是Maven模块的忠实拥护者。我们的Java商店实现您的项目的方式是定期发布服务层,然后使表示层依赖于最新版本。对此仍有讨论的余地,但它肯定对我们有用。我们将Web界面和REST界面作为单独的Maven项目,因为它们通常位于不同的.war文件中,因此需要单独部署。

顺便说一句,我将加强对构建和依赖管理工具的了解。一旦您的项目增长到任何合理的规模,就需要它们。诸如Maven,Jenkins和Nexus之类的免费工具使发布管理不再是问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.