You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类。以下是可能的原因及排查方向:

  1. @Lookup注解使用不当

    • 检查ServiceFacadeImpl是否使用了Spring的@Lookup注解。如果有,需确保:
      • Lookup方法是public abstract修饰
      • 返回类型为接口或抽象类,而非具体实现类
      • 方法不能是final或static
  2. JDK版本不匹配

    • 对比本地开发环境与Rancher集群的JDK版本,确保编译版本(pom.xml中maven-compiler-plugin配置的source/target)与运行版本一致。若本地用高版本JDK编译,集群用低版本运行,会导致类字节码无法被正确加载自省。
  3. 打包完整性问题

    • 解压部署的app.jar,检查BOOT-INF/classes/fi/op/bcsio/service/impl/目录下是否存在ServiceFacadeImpl.class文件,确认打包时未遗漏该类。
    • 检查pom.xml中的spring-boot-maven-plugin配置,确保插件正确打包所有编译后的类资源。
  4. 类加载器与依赖冲突

    • 使用mvn dependency:tree分析项目依赖,排查是否存在Spring相关依赖版本冲突,尤其是与类加载、Bean创建相关的模块。
    • 检查Rancher容器中的类路径,确认是否存在缺失的依赖包,或第三方Jar包与Spring Boot的类加载机制冲突。
  5. 启用调试日志

    • 在Rancher部署的应用配置中添加日志参数:logging.level.org.springframework=DEBUG,查看更详细的Bean创建、类加载过程日志,定位具体失败的环节。

内容的提问来源于stack exchange,提问作者Shruti Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:16