【问题标题】:Proper location for common models and utils, for multi-module maven project using spring-boot常见模型和实用程序的正确位置,用于使用 spring-boot 的多模块 maven 项目
【发布时间】:2020-04-15 03:52:40
【问题描述】:

有一个多模型的maven项目,目录布局如下:

xxx-父母/ 常见的/ 公共网络/ 会员API/ 管理员-api/ 市场服务/ ...

如你所见,有一个父pom,还有多个子模块,commoncommon-xxx模块是公共部分,可以作为其他非公共模块的依赖,用于代码重用。


问题

  • 一个。您会将model 类放在哪里,这些类通常是 POJO,带有私有字段和 getter/setter。
    这些模型可能会被多个不常见的子模块重用,(例如 market-serviceadmin-api
  • B。对于某些api,这些模型可以在返回的json中重用,但只需要部分字段,您会为这种情况创建一个单独的POJO (通常我称之为entity?而且,如果是这样,您可能会将其放在特定的子模块中(例如admin-api),而不是常见的项目,对吧?
  • C。如果这是一个基于spring-boot 的项目,并且它使用Redis,我们编写了一个redis util,它可以用于大多数redis 操作。
    问题是如果我们把redis util和它的maven依赖放到common中,那么它会在应用启动时自动连接redis,但是有些子模块不需要redis。
    我正在考虑的解决方案是:
    • 为实用程序创建一个单独的子模块common-redis
      但是也会有其他的实用程序(例如common-jdbc,而且似乎有太多的通用模块。
    • 通过@EnableAutoConfiguration 为特定功能(例如 redis)禁用 sprint-boot 的自动配置,这样它就不会在启动时尝试连接到 redis。

【问题讨论】:

    标签: java spring-boot maven redis microservices


    【解决方案1】:

    你的 maven 多模块结构:

    xxx-parent/
          common/
          common-web/
          member-api/
          admin-api/
          market-service/
          ...
    

    让我单独回答问题。

    A. 你会将模型类(通常是 POJO)放在哪里 私有字段和 getter/setter。这些模型可能被 多个不常见的子模块,(例如市场服务和 admin-api)。

    通常,模型类位于父项目xxx-parent 下名为xxx-entitiesxxx-defs(defs 代表定义)的单独模块下。我不确定common 模块包含什么,但有些项目使用xxx-commons 这个词来定义通用模型(/POJOs/Entities)。这是您作为依赖项提供给其他模块的模块。示例:如果您有一个单独的持久层,它希望对模型类进行操作,并且您希望将其与您为服务编写的 REST 客户端库分开。

    B. 对于某些 api,这些模型可以在返回的 json 中重用,但是 只需要部分字段,你会创建一个单独的POJO (通常我称之为实体)对于这种情况?如果是这样,你会 可能把它放在特定的子模块中(例如 admin-api),而不是 常见的项目,对吧?

    您可以重复使用我之前提到的相同模型库。如果您只需要部分字段,则仅设置这些字段(而其他字段保持为空)并返回。大多数 REST 库都有序列化设置,您可以将其设置为在从对象生成 JSON 时忽略空值。示例:Ignore null from Json using Jackson.

    C. 如果这是一个基于 spring-boot 的项目,并且它使用 Redis,我们 写了一个redis util,可以复用大部分redis操作。 问题是如果我们把 redis util 和它的 maven 依赖 变成common,然后它会在应用程序启动时连接到redis 自动,但有些子模块不需要redis。

    您的方法听起来不错。您可以拥有一个类似 data-utils 的库,它可以包含与数据库(Redis、RDBMS 等)相关的操作的包装器。您可以使用init 之类的方法,这些方法将确保它们不会自动加载,除非他们的客户明确调用。应注意确保 Redis 主机名、端口等配置应从包含此 data-utils 客户端的父模块加载,并且此库不能包含此类配置。

    【讨论】:

    • 很高兴听到其他人通常会这样做。
    • @EricWang,这能回答你的问题吗?
    • 老实说,我很确定,部分问题仍然是模糊的,我已经投票了,如果模糊部分得到确认,我将来可能会接受。
    • @EricWang,当然。
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2015-10-10
    • 2016-04-28
    • 1970-01-01
    • 2014-06-02
    • 2016-03-27
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多