Dubbo+SpringBoot整合: 依赖注入Null Pointer Exception的问题

发布于 2022-09-07 15:56:19 字数 835 浏览 16 评论 0

我用Dubbo+SpringBoot搭建微服务
controller和service分别属于两个服务
里面分别有如下类

@RestController
@RequestMapping("product")
public class ProductController{

    @Reference(version="1.0.0")
    ProductService productService;
    
    @GetMapping("create")
    public String createProduct(){
        return productService.createProduct();
    }
}


@Component
@Service(version = "1.0.0")
public class ProductServiceImpl implements ProductService {
   @Override
    public String createProduct(){
        return "created";
    }
}

我发现如果我先启动service服务,后启动controller服务,运行OK
但是如果我先启动controller服务,后启动service服务,productService就是null,出现Null Pointer Exception

我的理解是:因为service后启动,所以controller中的productService依赖注入时找不到实例,注入失败。
但是这样的话,那假如有两个service微服务,A和B,A中的某个类需要B中某个类的服务,而B中某个类又需要A中某个类的服务,那谁先启动都会有问题啊。
怎么回事?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小嗲 2022-09-14 15:56:19
  1. 建议你在细看一下Dubbo文档,并找一些示例看一下
  2. 关于Reference,建议你单独新建一个文件夹 将Reference 独立出来,避免重复写Reference(version="1.0.0") 等信息
  3. Dubbo是有服务注册与发现的。假如A依赖B,A先启动,B后启动。①可以设置A中对B的依赖 check=false 不进行检查 ②B启动时,会给所有已订阅该服务的系统进行推送/通知~ (其实还是1.的问题,多看文档)
吹梦到西洲 2022-09-14 15:56:19

spring mvc注解和 dubbo注解配置在两个不同的context导致的
比较简单的解决办法是不要在controller里使用dubbo注解

若水微香 2022-09-14 15:56:19

dubbo=2.6.1

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
//消费时
    @Reference(version="0.0.1", timeout = 5000, check= false)
    private HelloWorldService helloWorldService;
// 启动类
@SpringBootApplication
@EnableDubboConfiguration
@EnableAspectJAutoProxy

服务提供方

@Service(version = "0.0.1", timeout = 5000, interfaceClass = HelloWorldService.class)
public class HelloWorldServiceImpl implements HelloWorldService {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    /*
     * (non-Javadoc)
     * 
     * @see org.bjhxxt.shop.service.HelloWorldService#sayHello(java.lang.String)
     */
    @Override
    public String sayHello(String name) {
        logger.debug("hello dubbo service");
        return "Hello dubbo for " + name;
    }

}

亲测是可以的,当然除了上面的如果有漏掉的,就不一定了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文