Spring Boot集成Hateoas部署WebLogic 12c启动失败问题
这个问题我之前碰到过类似的情况,核心原因是Springfox(Swagger)和Spring HATEOAS都依赖了Spring Plugin库,两者启动时会创建多个PluginRegistry类型的Bean,而HATEOAS的HateoasConfiguration.linkDiscoverers()方法只需要一个匹配的Bean,Spring没法确定选哪个,直接导致ApplicationContext启动失败。另外你的POM里还有个隐藏坑:HATEOAS的版本和Spring Boot parent版本不匹配,这会让冲突更严重。
下面给你分步解决的方案:
1. 先修复HATEOAS依赖版本不兼容问题
你的Spring Boot parent用的是2.2.1.RELEASE,但手动指定了HATEOAS为1.2.2.RELEASE,版本不匹配会引发各种兼容性问题。先把HATEOAS的依赖改成继承parent版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> <!-- 删掉手动指定的version,让它用parent的2.2.1.RELEASE版本 --> </dependency>
2. 排除Springfox中的Spring Plugin依赖
Springfox自带的Spring Plugin版本和HATEOAS的版本冲突,导致重复生成PluginRegistry Bean。修改Swagger的两个依赖,排除掉Spring Plugin相关的包:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> <exclusions> <exclusion> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-metadata</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.6.1</version> <exclusions> <exclusion> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-metadata</artifactId> </exclusion> </exclusions> </dependency>
这样Springfox会直接使用HATEOAS带来的兼容版本的Spring Plugin,就不会再生成重复的Bean了。
3. 如果上述方法无效,试试自定义HATEOAS配置
要是排除依赖后还是有问题,你可以自己写个配置类,手动创建LinkDiscoverer的PluginRegistry并标记为@Primary,让Spring优先用这个Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.hateoas.client.LinkDiscoverer; import org.springframework.hateoas.mediatype.hal.HalLinkDiscoverer; import org.springframework.hateoas.config.HateoasConfiguration; import org.springframework.plugin.core.PluginRegistry; import org.springframework.http.MediaType; import java.util.ArrayList; import java.util.List; @Configuration public class CustomHateoasConfig extends HateoasConfiguration { @Bean @Primary public PluginRegistry<LinkDiscoverer, MediaType> linkDiscoverers() { List<LinkDiscoverer> discoverers = new ArrayList<>(); // 这里先加HAL格式的链接发现器,你要是需要其他格式可以再加 discoverers.add(new HalLinkDiscoverer()); return PluginRegistry.of(discoverers); } }
4. 最后验证部署
修改完之后重新打包项目,部署到WebLogic 12c。要是还是启动失败,记得清理WebLogic的临时缓存(删掉domain目录下的tmp和cache文件夹),再重新部署试试。
内容的提问来源于stack exchange,提问作者abhishek

