Spring Boot部署Rancher集群遇Lookup方法解析失败问题求助
Spring Boot部署Rancher集群时Bean创建失败问题分析
报错信息
取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为'customerOnboardingEndpoint'的Bean失败,该Bean定义在URL [jar:file:/app/app.jar!/BOOT-INF/classes!/fi/op/bcsio/endpoint/CustomerOnboardingEndpoint.class]中;通过构造函数参数0表达的依赖不满足;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为'controller'的Bean失败,该Bean定义在URL [jar:file:/app/app.jar!/BOOT-INF/classes!/fi/op/bcsio/controller/Controller.class]中;通过构造函数参数0表达的依赖不满足;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建名称为'serviceFacadeImpl'的Bean失败:Lookup方法解析失败;嵌套异常为java.lang.IllegalStateException: 无法从ClassLoader [org.springframework.boot.loader.LaunchedURLClassLoader@5e853265]中自省类[fi.op.bcsio.service.impl.ServiceFacadeImpl]
Controller类代码
package fi.op.bcsio.controller; import static fi.op.jopo.logging.LogMarker.SENSITIVE_DATA; import static fi.op.jopo.logging.LogMarker.TECH; import static org.slf4j.LoggerFactory.getLogger; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import fi.op.bcsio.bancs.business.CreateCustomerBancsRequestBody; import fi.op.bcsio.bancs.business.CreateCustomerShipBancsRequestBody; import fi.op.bcsio.bancs.response.bean.SuccessResponse; import fi.op.bcsio.configurableproperties.ExternalProperty; import fi.op.bcsio.domain.bean.bancs.customership.request.CreateCustomerShipRequest; import fi.op.bcsio.domain.bean.bancs.request.CustomerCustomerShipRequest; import fi.op.bcsio.domain.bean.bancs.response.CustomerNCustomershipCheck; import fi.op.bcsio.domain.bean.luukku.response.LuukkuBasicInfoResponse; import fi.op.bcsio.domain.bean.luukku.response.LuukkuCustomerShipResponse; import fi.op.bcsio.errorhandler.DateUtility; import fi.op.bcsio.exception.BadRequestError; import fi.op.bcsio.exception.InternalServerError; import fi.op.bcsio.exception.UnauthorizedError; import fi.op.bcsio.jwt.TokenValidation; import fi.op.bcsio.luukku.business.LuukkuLogic; import fi.op.bcsio.service.ServiceFacade; import fi.op.bcsio.validation.bean.RequestBodyValidation; import fi.op.jopo.security.ecb.EcbUtils; @Component public class Controller { private final Logger logger = getLogger(getClass()); @Autowired ServiceFacade serviceFacade; @Autowired TokenValidation tokenValidation; @Autowired LuukkuLogic luukkuLogic; @Autowired CreateCustomerBancsRequestBody createCustomerBancsRequestBody; @Autowired ExternalProperty externalProperty; @Autowired EcbUtils ecbUtils; @Autowired CreateCustomerShipBancsRequestBody createCustomerShipBancsRequestBody; String internalServerExceptionMessage = "Unable to process the request!"; public void validatingToken(String authorizationToken, String requestId, RequestBodyValidation requestBodyValidation) { tokenValidation.validateToken(authorizationToken, requestId, requestBodyValidation); } public ResponseEntity<?> checkAndOnboardCustomer(RequestBodyValidation requestBodyValidation, String requestId, String authorizationToken) { try { CustomerNCustomershipCheck enquiryServiceResponse = serviceFacade.customerandCustomershipCheck( requestBodyValidation.getBankNumber(), requestBodyValidation.getCustomerId(), "18", requestId); logger.info(SENSITIVE_DATA,"Response from BaNCS Customer and CustomerShip enquiry Service {}", enquiryServiceResponse); if ((enquiryServiceResponse.getCustomership().getCustomershipExists().equals(1)) && (enquiryServiceResponse.getCustomership().getCustomerExists().equals(1))) { SuccessResponse successResponse = new SuccessResponse("CUSTOMER EXISTS", DateUtility.getDate(), requestId); logger.info(TECH,"CUSTOMER EXISTS"); return new ResponseEntity<SuccessResponse>(successResponse, HttpStatus.OK); } else if ((enquiryServiceResponse.getCustomership().getCustomershipExists().equals(0)) && (enquiryServiceResponse.getCustomership().getCustomerExists().equals(0))) { String encryptedssn = ecbUtils.encrypt(requestBodyValidation.getCustomerId(), ""); LuukkuBasicInfoResponse luukkuBasicInfoResponse = serviceFacade.luukkuBasicInfoResponse(requestId, authorizationToken); logger.info(SENSITIVE_DATA,"Response received from Luukku basic info is {}", luukkuBasicInfoResponse); LuukkuCustomerShipResponse[] luukkuCustomerShipResponse = serviceFacade.luukkuCustomerShipResponse(requestId, authorizationToken, encryptedssn); logger.info(SENSITIVE_DATA,"Response receives from Luukku customership is {}", (Object) luukkuCustomerShipResponse); CustomerCustomerShipRequest customerCustomerShipRequest = createCustomerBancsRequestBody .bancsCreateCustomerRequest(requestId, externalProperty, requestBodyValidation, luukkuBasicInfoResponse, luukkuCustomerShipResponse); logger.info(SENSITIVE_DATA,"Create Customer request body sent to Bancs is {}", customerCustomerShipRequest); serviceFacade.createCustomerCustomership(requestId, customerCustomerShipRequest); SuccessResponse successResponse = new SuccessResponse("CUSTOMER ONBOARDED", DateUtility.getDate(), requestId); logger.info(TECH,"CUSTOMER ONBOARDED"); return new ResponseEntity<SuccessResponse>(successResponse, HttpStatus.CREATED); } else if ((enquiryServiceResponse.getCustomership().getCustomershipExists().equals(0)) && (enquiryServiceResponse.getCustomership().getCustomerExists().equals(1))) { String encryptedssn = ecbUtils.encrypt(requestBodyValidation.getCustomerId(), ""); LuukkuCustomerShipResponse[] luukkuCustomerShipResponse = serviceFacade.luukkuCustomerShipResponse(requestId, authorizationToken, encryptedssn); logger.info(SENSITIVE_DATA,"Response received from Luukku customership is {}", (Object) luukkuCustomerShipResponse); CreateCustomerShipRequest createCustomerShipRequestBody = createCustomerShipBancsRequestBody .createCustomerShipBancsRequestBody(externalProperty, requestBodyValidation, luukkuCustomerShipResponse); logger.info(SENSITIVE_DATA,"Customership request body {}", createCustomerShipRequestBody); serviceFacade.createCustomerShip(requestId, createCustomerShipRequestBody); SuccessResponse successResponse = new SuccessResponse("CUSTOMERSHIP ONBOARDED", DateUtility.getDate(), requestId); logger.info(TECH,"CUSTOMERSHIP ONBOARDED"); return new ResponseEntity<SuccessResponse>(successResponse, HttpStatus.CREATED); } else { logger.info(TECH,"Customer and CustomerShip exist is neither of case 0 0 , 1 0, 1 1"); throw new InternalServerError(internalServerExceptionMessage, requestId); } } catch (InternalServerError e) { logger.info(TECH,"Internal Server Exception {}",e.getMessage()); throw new InternalServerError(e.getMessage(), e.getRequestId()); } catch (NullPointerException e) { logger.info(TECH,"Null Pointer Exception {}",e.getMessage()); throw new InternalServerError(internalServerExceptionMessage, requestId); } catch (BadRequestError e) { logger.info(TECH,"Bad Request Exception {}",e.getMessage()); throw new BadRequestError(e.getMessage(), e.getrequestId()); } catch (UnauthorizedError e) { logger.info(TECH,"Unauthorized Exception {}",e.getMessage()); throw new UnauthorizedError(e.getMessage(), e.getRequestId()); }catch (Exception e) { logger.info(TECH,"Exception {}",e.getMessage()); throw new InternalServerError(internalServerExceptionMessage, requestId); } } }
问题背景
应用在本地运行正常,但部署到Rancher集群时出现上述错误,已尝试在pom.xml中添加spring-data-elasticsearch依赖,问题仍未解决。
错误原因分析与排查步骤
核心错误指向
错误链的根因是serviceFacadeImpl Bean创建失败:Lookup方法解析失败,无法从LaunchedURLClassLoader中自省ServiceFacadeImpl类。以下是可能的原因及排查方向:
@Lookup注解使用不当
- 检查
ServiceFacadeImpl是否使用了Spring的@Lookup注解。如果有,需确保:- Lookup方法是
public abstract修饰 - 返回类型为接口或抽象类,而非具体实现类
- 方法不能是
final或static
- Lookup方法是
- 检查
JDK版本不匹配
- 对比本地开发环境与Rancher集群的JDK版本,确保编译版本(pom.xml中maven-compiler-plugin配置的source/target)与运行版本一致。若本地用高版本JDK编译,集群用低版本运行,会导致类字节码无法被正确加载自省。
打包完整性问题
- 解压部署的
app.jar,检查BOOT-INF/classes/fi/op/bcsio/service/impl/目录下是否存在ServiceFacadeImpl.class文件,确认打包时未遗漏该类。 - 检查pom.xml中的
spring-boot-maven-plugin配置,确保插件正确打包所有编译后的类资源。
- 解压部署的
类加载器与依赖冲突
- 使用
mvn dependency:tree分析项目依赖,排查是否存在Spring相关依赖版本冲突,尤其是与类加载、Bean创建相关的模块。 - 检查Rancher容器中的类路径,确认是否存在缺失的依赖包,或第三方Jar包与Spring Boot的类加载机制冲突。
- 使用
启用调试日志
- 在Rancher部署的应用配置中添加日志参数:
logging.level.org.springframework=DEBUG,查看更详细的Bean创建、类加载过程日志,定位具体失败的环节。
- 在Rancher部署的应用配置中添加日志参数:
内容的提问来源于stack exchange,提问作者Shruti Mishra
相关产品推荐
相关产品推荐

