Spring Boot3升级后MapStruct生成文件含javax依赖问题
把REST服务升级到Spring Boot 3后,已经手动把所有javax导入替换成了jakarta,但Maven打包时发现MapStruct生成的NotificationMapperImpl类里还带着javax.annotation.processing.Generated的导入。本地用Insomnia调用接口没问题,但IntelliJ IDEA里一直报javax.management.InstanceNotFoundException: orh.springframework.boot:type=Endpoint,name=Mappings,*的错误。试过硬写MapStruct版本(当前用的1.5.5.Final)没用,找不到这个javax依赖的来源,怕上线出问题,求解决办法。
1. 让MapStruct生成Jakarta版本的Generated注解
MapStruct 1.5.x支持通过编译参数指定生成类用的Generated注解全类名,直接在Maven编译器插件的compilerArgs里加一行配置:
<compilerArg>-Amapstruct.generatedAnnotation=jakarta.annotation.Generated</compilerArg>
这样生成的Mapper实现类就会自动引用jakarta.annotation.Generated,不会再出现javax的导入。
2. 升级Maven Compiler Plugin版本
你现在用的maven-compiler-plugin 3.8.1对Java 17和Jakarta的支持不够好,建议升级到3.11.0及以上版本,确保编译过程能正确处理Jakarta相关的注解:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <!-- 其他原有配置保留 --> </plugin>
3. 排查父POM的传递依赖
虽然改不了父POM,但可以用Maven命令查一下是不是有依赖偷偷引入了javax.annotation的包:
mvn dependency:tree | grep javax.annotation
如果查到有这类传递依赖,直接在自己的POM里把它排除掉:
<dependency> <!-- 这里填查到的有问题的依赖 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> </exclusion> </exclusions> </dependency>
4. 修复IDEA里的Mappings端点错误
IDEA的这个错误大概率是缓存或者Actuator端点配置的问题,试试这两步:
- 先执行
mvn clean install,然后重启IDEA清缓存 - 检查项目的
application.properties或application.yml,如果用了Actuator,确保mappings端点的配置是对的:
management.endpoints.web.exposure.include=mappings
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${org.projectlombok.lombok.version}</version> </path> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.mapstruct.version}</version> </path> </annotationProcessorPaths> <compilerArgs> <compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg> <compilerArg>-Amapstruct.generatedAnnotation=jakarta.annotation.Generated</compilerArg> </compilerArgs> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Tessa

