Solon v3.7.2

问题:为什么 injection failed(注入失败)?

</> markdown

首先要确认:

  • 是托管对象(有没有被扫描到?)
  • 还是自己 new 的?(这个是无法注入!)

1、如果是应用属性相关的

要找一下,有没有相关的配置?

此例,当没有 xxx.yyy 配置时会出错:

import org.noear.solon.annotation.Inject;

@Inject("${xxx.yyy}")
String yyy;

2、如果是托管 Bean 相关的

正常的推理:

思考顺序推理处理建议
1注入失败?
2说明(容器)没有相关 Bean 注册
3Bean 是通过配置的?还是扫描的?
4如果是通过配置的?可能是缺少配置?或配置错了?
5如果没有扫描到?为什么会没扫到?检查下扫描范围

参考资料:《Bean 容器的扫描方式与范围》

示例1:会出错(bbb 包的 App 启动时,不会扫描 aaa 包下的类):

import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;

//---

package demo.aaa;
@Component
public class UserService {}

//---

package demo.bbb;
@Controller
public class UserController {
    @Inject
    UserService userService;
}

package demo.bbb;
public class App { //把 App 移到 demo 下,就不会出错(可同时扫描 aaa, bbb 等下级包)
    public static void main(String[] args) {
        Solon.start(App.class, args);
    }
}

示例2:会出错(配置对应的表达式下没有需要的 Mapper)

solon.dataSources:
  db1!:
    class: "com.zaxxer.hikari.HikariDataSource"
    jdbcUrl: jdbc:mysql://localhost:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
    driverClassName: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
  
mybatis.db1:
    mappers:       
        - "demo.bbb.mapper.*"
package demo.aaa.mapper;

public class UserMapper {}

//---

package demo.bbb.mapper;

public class DemoMapper {}

//---

package demo.bbb.service;

@Component
public class UserService {
    @Inject
    UserMapper userMapper;
}