Spring Modulith应用中生成的OpenAPI代码包访问权限配置问题
解决Spring Modulith访问生成的OpenAPI包问题
针对生成的restinterfaces包无法手动添加package-info.java的情况,有以下几种可行方案:
1. 配置OpenAPI Generator自动生成带注解的package-info.java
修改openapi-generator-maven-plugin的配置,让插件在生成代码时自动创建包含@NamedInterface注解的package-info.java文件。
在Maven插件配置中添加自定义模板或属性注入:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>对应版本号</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${project.basedir}/src/main/resources/openapi.yaml</inputSpec> <generatorName>spring</generatorName> <packageName>my.app.restinterfaces</packageName> <additionalProperties> <additionalProperty>packageInfo=true</additionalProperty> <additionalProperty>packageInfoTemplate=${project.basedir}/src/main/resources/templates/package-info.java.mustache</additionalProperty> </additionalProperties> </configuration> </execution> </executions> </plugin>
然后在自定义模板文件package-info.java.mustache中写入:
@org.springframework.modulith.NamedInterface(allowedModules = {"domainA", "domainB"}) package {{package}};
插件生成代码时会自动在restinterfaces包下创建符合要求的配置文件。
2. 手动创建package-info.java并纳入编译路径
在项目源码目录下创建对应包结构src/main/java/my/app/restinterfaces/,添加package-info.java文件:
@org.springframework.modulith.NamedInterface(allowedModules = {"domainA", "domainB"}) package my.app.restinterfaces;
修改Maven的build配置,将源码目录和生成目录同时纳入编译范围:
<build> <sources> <source>src/main/java</source> <source>target/generated-sources/my/app/restinterfaces</source> </sources> </build>
编译时手动创建的配置文件会和生成的代码合并,Spring Modulith即可识别包的访问规则。
3. 编程式配置Spring Modulith模块依赖
如果不想修改生成代码或添加额外文件,可通过代码直接定义模块间的访问权限。创建配置类:
import org.springframework.modulith.core.ApplicationModules; import org.springframework.modulith.core.NamedInterface; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ModulithConfig { @Bean public ApplicationModules applicationModules() { return ApplicationModules.of(MyApplication.class) .modifyModule("restinterfaces") .asNamedInterface(NamedInterface.of("restinterfaces").allowedModules("domainA", "domainB")) .and(); } }
这种方式无需修改生成的包结构,直接通过代码配置模块访问规则。
内容的提问来源于stack exchange,提问作者Sidekick.John
相关产品推荐
相关产品推荐

