详细的报错内容:
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;