私はうまくIDEAで私springbootプロジェクトを実行しますが、javaコマンドでjarファイルと実行にそれを詰めたときに、スプリングコンテキストからBeanを取得するとき、ちょうどjava.lang.NullPointerExceptionがを得たことができます。
単にエラーを得たファーストクラス:
@Service
public class MdspiImpl extends CThostFtdcMdSpi {
public MdspiImpl(CThostFtdcMdApi mdapi) {
m_mdapi = mdapi;
logger.info("MdspiImpl is creating...");
***mdr = SpringContextUtil.getBean("marketDataRobot");//this is the error code***
}
}
第二のクラス:
@Service
public class MarketDataRobot {
}
SpringContextUtilクラス:
@Component("SpringContextUtil")
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
}
Gradleのファイル:
jar {
baseName = 'programmingTrading'
version = '0.1.0'
manifest {
attributes 'Main-Class': 'com.blackHole.programmingTrading'
}
}
実行中の例外:
WARN main[AbstractApplicationContext.java:557 Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mdspiImpl' defined in URL [jar:file:/E:/workspace/simuPrd/programmingTrading-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/blackHole/programmingTrading/infrastructure/MdspiImpl.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.blackHole.programmingTrading.infrastructure.MdspiImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException]
[com.blackHole.programmingTrading.infrastructure.MdspiImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:184)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
... 27 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.blackHole.programmingTrading.SpringContextUtil.getBean(SpringContextUtil.java:35)
at com.blackHole.programmingTrading.infrastructure.MdspiImpl.<init>(MdspiImpl.java:46)
それはまた別の問題から生じる:@Autowired注釈は仕事をしません...このように使用している場合:
@Component
public class Scu{
}
別のクラスで:
@Autowired
private Scu scu;
logger.info(String.format("MdspiImpl is creating...[%s]", scu.toString()));
ヌル:java.lang.NullPointerExceptionがを取得します
このような春ブート構成:
@SpringBootApplication
public class ProgrammingTrading {
public static void main(String[] args) {
SpringApplication.run(ProgrammingTrading.class, args);
}
}
そのBeanを取得するためにSpringContextUtilを使用しての理由の一部です...おかげでたくさん!
SpringContextUtil
あなたがやっているように...とあなたはそれを定義しているため、静的にアクセスしないでください@Component
次のようにします。
@Service
public class MdspiImpl extends CThostFtdcMdSpi {
@Autowired
private SpringContextUtil springContextUtil;
public MdspiImpl(CThostFtdcMdApi mdapi) {
m_mdapi = mdapi;
logger.info("MdspiImpl is creating...");
***mdr = springContextUtil.getBean("marketDataRobot");
}
}
が原因SpringContextUtil
ではないが春を介して注入、単に、静的にアクセスされてapplicationContext
、それの内側には無視され、nullがあなたのケースです。
また、削除static
修飾子を。
@Component
public class SpringContextUtil implements ApplicationContextAware {
private ApplicationContext applicationContext;
// include getter/setter for applicationContext as well
public <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
}
編集します
最新のサンプルプロジェクトからのトラブル。
@Service
public class ExampleService {
@Autowired
private Logger logger;
public ExampleService() {
this.logger=logger;
logger.info("Im working");
}
}
ここでLogger
はnullになりますExampleService
コンストラクタは、射出開始前に呼び出されるため、コンストラクタは、トリガされますが、次のようにコンストラクタが言ってあなたは、注射を組み込む場合は、この動作をマージすることができます。
@Service
public class ExampleService {
private final Logger logger;
public ExampleService(Logger logger) {
this.logger = logger;
logger.info("Im working");
}
}
どんなトラブルもなく完璧に動作...