我想说清楚,因为这个问题很复杂,所以
answer
绝对不是
only
实现的方式
project structure and versioning
。可能还有很多其他方式,我只是分享我以前使用过的相关内容。
显然,有不同的方法来构建您的代码库,即
在里面
Layer-based project structure
您的代码的结构基于您所拥有的不同类型的层,即控制器、服务等,而
Feature-based project structure
您的代码的结构基于
features
您的系统,请阅读
here
了解更多信息。
网上有很多资源可以展示不同类型的软件包结构,我个人坚持
layer-based project structure
因为我更喜欢根据
layers
而不是功能。
项目结构
开始项目框架的一个非常简单的方法是看一些示例
Spring
网络应用程序。例如,我去
Spring Initializer
并选择以下选项
-
项目名称(即myproj)
-
组名称(即com)
-
选择模块(即REST、JPA等)
-
生成
现在,我有一个基于休息的
Spring Boot
可以用作骨架的项目,以根据
图层
。您不必使用
弹簧防尘套
但是,我想展示的是
弹簧防尘套
建议的项目结构
REST
web服务。
我通常有以下几层
-
控制器
-
dao公司
-
服务
-
模型
-
dto公司
-
例外
-
验证器
-
util公司
以此类推,下面是项目结构的截图
以及
unit test
包结构如下所示,您可以想象其他测试类的样子。
如果你有
integration test
或者你会提到它吗
end to end test
在java应用程序本身中,您需要
src/integ-test/java
src/integ-test/resources
端点版本控制
可能有不同的方法来版本端点。我之前使用的一种方法是
GSON's versioning support
它可能对你有用,也可能不管用,但无论如何,在这里分享它。
如果您注意到上面的屏幕截图中有以下软件包
com.myproj.dto.inbound
com.myproj.dto.outbound
DTO
代表
Data Transfer Object
如上图所示
UserInDTO.java
是的表示
User.java
对象,您将使用它
@RequestBody
在控制器的端点中。这个
UserOutDTO.java
是
使用者JAVA
出去的对象。使用DTO时
-
您可以为系统的使用者看到的内容和您在模型中使用的内容采用不同的命名约定(即。
使用者JAVA
)
-
你可以
include
和
exclude
传出和传入中的字段
DTOs
无需对模型/业务对象进行不必要的更改(即。
使用者JAVA
)
现在您有了DTO,如果您正在使用
GSON
那么你可以用它
Versioning
功能到
包括
和
排除
中的字段
用户输出到。JAVA
使用注释,例如
@Since(1.5)
和
@Until(2.3)
自从
GSON公司
是序列化/反序列化库,或者换句话说,它转换
JSON
到
Java Object
反之亦然,那么它有能力
包括
和
排除
字段之前的字段
Object
已转换为
JSON
通过编写序列化和反序列化适配器,您可以实现更多的功能。
以下是
用户输出到。JAVA
以及如何对字段进行版本控制,以在特定版本后包括和排除字段
public class UserOutDTO {
@Expose
@SerializedName("User id")
private int id;
@Expose
private String firstName;
@Expose
private String lastName;
/*
* This field will become available for all requests coming for version 2.0 onwards. For a request before
* version 2.0 the address field won't be available.
*/
@Expose
@Since(2.0)
private String address;
/*
* This field will become available after version 3.0 an example when you extend your model
*/
@Expose
@Until(3.0)
private String nickname;
//Getters and Setters
}
我希望这有帮助。你也可以签出这个问题,有很多非常有用的答案
Package structure for a Java project?