gpt4 book ai didi

java - 运行从 springboot 项目打包的 jar 时无法获取 bean

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:59:45 25 4
gpt4 key购买 nike

我可以在 IDEA 中很好地运行我的 springboot 项目,但是当将它打包到一个 jar 并使用 java 命令运行时,从 spring 上下文获取 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: null

spring-boot 配置如下:

@SpringBootApplication
public class ProgrammingTrading {
public static void main(String[] args) {
SpringApplication.run(ProgrammingTrading.class, args);
}
}

这是使用 SpringContextUtil 获取 bean 的部分原因...非常感谢!

最佳答案

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 不是通过 Spring 注入(inject)的,而是简单地静态访问的,因此其中的 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 构造函数被触发时,因为构造函数在注入(inject)开始之前被调用,但是如果合并,则可以合并此行为通过上述构造函数注入(inject)如下;

@Service
public class ExampleService {

private final Logger logger;

public ExampleService(Logger logger) {
this.logger = logger;
logger.info("Im working");
}
}

完美运行,没有任何问题......

关于java - 运行从 springboot 项目打包的 jar 时无法获取 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56980518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com