springbootプロジェクトからパックのjarを実行するときcoundn't Beanを取得

李天:

私はうまく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を使用しての理由の一部です...おかげでたくさん!

buræquete:

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");
    }
}

どんなトラブルもなく完璧に動作...

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=227530&siteId=1