Spring 反射调用类中的@Autowired注解服务空指针
错误代码
- 反射代码
// 反射调用对应服务函数并传递参数
Class serviceClass = Class.forName(serviceUri);
Object obj = serviceClass.newInstance();
// 调用serviceClass的invoke函数,并设置默认参数;
Method method = serviceClass.getMethod(invoke, String.class);
// 调用Method类的方法invoke运行invoke方法
Object object = method.invoke(obj, params);
- 调用的有@Autowired注解的类
@Component
public class CompanyExecute {
@Autowired
private CompanyService companyServiceImpl;
public boolean insertCompany(String companyVoString) {
boolean insertFlag = companyServiceImpl.insertCompany(companyVoString);
return insertFlag;
}
}
- @Autowired注解的类
(有@service注解,还是不好使!!)
@Service
public class CompanyServiceImpl implements CompanyService {
@Override
public boolean insertCompany(String companyVoString) {
....
}
}
错误日志
3980 at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
--- at com.frank.sbr.action.consumer.execute.CompanyExecute.insertCompany(CompanyExecute.java:26)
[MessageThread_1] ... 13 more
解决方案
原因:反射的类无法被Spring进行管理。
解决:在使用前初始化一下(使用@PostConstruct
注解)
- 代码
public class CompanyExecute {
public static CompanyExecute companyExecute;
@Autowired
private CompanyService companyServiceImpl;
/**
* 初始化当前类
*/
@PostConstruct
public void init() {
companyExecute = this;
}
public boolean insertCompany(String companyVoString) {
boolean insertFlag = companyExecute.companyServiceImpl.insertCompany(companyVoString);
return insertFlag;
}
}