【FAQ】解决报错:UnsatisfiedDependencyException: Error creating bean with name 'timeSlotValidateController'

详细的报错内容:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.taobao.pandora.boot.loader.LaunchRunner.run(LaunchRunner.java:38)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'timeSlotValidateController': Unsatisfied dependency expressed through field 'timeSlotCheckManager'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'timeSlotCheckManagerImpl' defined in file [/Users/xx-service/target/classes/com/manager/general/impl/TimeSlotCheckManagerImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
 

简单来说,就是我自己定义的一个java bean创建失败

网上查询了一些相关的案例,对比之后发现与我所遇到的情况不一样,所以记录以供参考

@Component
@EnableTransactionManagement
public class TimeSlotCheckManagerImpl implements TimeSlotCheckManager {
    private final static Logger logger = LoggerFactory.getLogger(TimeSlotCheckManagerImpl.class);

    private String APP_ID;

    @Autowired
    private ReFlashSaleConfigDAO reFlashSaleConfigDAO;

    /**
     * @param appId                        App Id for the API that will be validated
     */
    public TimeSlotCheckManagerImpl(String appId) {
        APP_ID = appId;
    }
}

如上是我简化版的代码。可以看到,在我的bean中,我自定义了一个构造方法。而这也正好是问题所在。

(基于尝试之后的推测)bean的自动创建需要一个默认的无参构造方法(因为如果构造方法有参数,它不知道参数应该是什么?)

所以当我自定义了一个构造方法,且带参数时,bean创建就失败了

 

试了一下增加一个无参构造方法,bean可以创建成功。

所以解决这个问题的一个曲折的方案就是,把自定义构造方法要做的事情放到一个普通方法(如init方法)中去

然后依然用下面的这种方式来自动生成bean

@Autowired
private TimeSlotCheckManagerImpl timeSlotCheckManager;

 

需要注意的是,如果用自定义的构造方法来手动创建bean,那么bean里面通过下面方式创建成员不会被实例化:

@Autowired
private ReFlashSaleConfigDAO reFlashSaleConfigDAO;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值