@PostConstruct dubbo还未注册此时调用服务报错

本文介绍了一个自定义的BeanPostProcessor实现,用于Spring框架中Bean的初始化前后处理逻辑,特别是针对特定Bean(如SessionFlashMapManager)执行额外启动任务。
package com.hanshow.mapserver.portal.web;

import com.hanshow.component.thread.StartProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;

@Component
public class BeanPostProcessorForWeb implements BeanPostProcessor {
    static Logger logger = LoggerFactory.getLogger(BeanPostProcessorForWeb.class);
    @Autowired
    private StartProcessor startProcessor;
    @Nullable
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        logger.info("before beanName={}",beanName);
        return bean;
    }

    @Nullable
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        logger.info("after beanName={}",beanName);
        if("org.springframework.web.servlet.support.SessionFlashMapManager".equals(beanName)){
            try {
                //本来在PostConstruct执行的代码某个bean加载完毕后在执行此时dubbo已经注册
                //org.springframework.web.servlet.support.SessionFlashMapManager需要根据实际情况改下
                startProcessor.startup();
            } catch (Exception e) {
                logger.error("",e);
            }
        }
        return bean;
    }
}

### 使用 `@PostConstruct` 注解启动时报错的解决方案 当使用 `@PostConstruct` 进行 Feign 调用报错,具体表现为 "choosing server for key null" 的问题[^1]。这通常意味着在初始化阶段尝试访问尚未完全准备好的服务实例。 为了确保 `@PostConstruct` 方法能够正常工作,在 Spring Boot 应用程序中需要注意以下几点: #### 1. 添加必要的依赖项 如果项目基于 Java 11 或更高版本,则需要显式引入 `javax.annotation-api` 作为 Maven 依赖来支持 `@PostConstruct` 和其他相关注解[^4]。 ```xml <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> ``` #### 2. 配置正确的加载顺序 确保带有 `@PostConstruct` 注解的方法不会过早执行而引起依赖注入失败或其他资源未准备好等问题。可以通过调整 Bean 初始化逻辑或设置合适的懒加载策略来实现这一点。 #### 3. 检查日志输出 观察应用程序的日志可以提供更多关于错误发生位置的信息。例如,从给定的例子可以看到 OrderService 构造函数先于任何 `@PostConstruct` 方法被执行[^2]。因此应确认所有必需的服务都已经成功注册并可用之后再进行实际业务操作。 #### 4. 修改代码结构 对于特定场景下的问题(如Feign客户端),可能还需要重新设计部分代码架构以适应微服务体系的要求。比如通过配置 Ribbon 客户端属性、自定义负载均衡器等方式优化远程调用过程中的行为模式。 ```java import javax.annotation.PostConstruct; import org.springframework.stereotype.Service; @Service public class MyService { private final SomeClient someClient; public MyService(SomeClient someClient) { this.someClient = someClient; } @PostConstruct public void init() { // Ensure service discovery has completed before making calls. try { Thread.sleep(5000); // Wait a few seconds to allow services to register themselves. } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // Proceed with initialization logic that involves calling other microservices via Feign client. System.out.println(someClient.callRemoteEndpoint()); } } ``` 上述代码展示了如何利用线程休眠等待一段时间让服务发现机制完成后再继续执行后续的操作,从而减少因目标服务器不可达而导致的选择键为空(`null`)的情况出现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值