我正在尝试建立一个 Spring Boot 项目,更准确地说,我正在将我的 MVC 项目转移到 Spring Boot,以免部署到 Tomcat。我摆脱了 applicationContext.xml 并且第一次将所有内容与注释混合在一起传输到 JavaConfig,更准确地说,在 applicationContext.xml 中我只有一个与数据库的连接。
它是:
<bean id="zkSettingsHolder" class="com.uraltranscom.calculaterate.util.ZookeeperUtil.ZookeeperSettingHolder" />
<!-- дешифровка пароля -->
<bean id="decodedPassword" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="com.uraltranscom.calculaterate.util.ZookeeperUtil.KeyMaster"/>
<property name="targetMethod" value="dec"/>
<property name="arguments">
<list>
<value>#{zkSettingsHolder.password}</value>
<value>#{zkSettingsHolder.secretKey}</value>
</list>
</property>
</bean>
<!-- устанавливаем соединение -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" lazy-init="false" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="#{zkSettingsHolder.dataBase}"/>
<property name="username" value="#{zkSettingsHolder.user}"/>
<property name="password" value="#{decodedPassword}"/>
</bean>
<bean class="com.uraltranscom.calculaterate.util.ConnectUtil.ConnectionDB">
<property name="dataSource" ref="dataSource"/>
</bean>
它变成了:
@Configuration
@ComponentScan({"com.ex.calc"})
public class AppConfig {
@Bean
@Primary
public ZookeeperSettingHolder zookeeperSettingHolder() {
return new ZookeeperSettingHolder();
}
@Bean
public CommonsMultipartResolver commonsMultipartResolver() {
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
commonsMultipartResolver.setMaxUploadSize(10000000);
return commonsMultipartResolver;
}
@Bean(name = "decodedPassword")
public MethodInvokingFactoryBean methodInvokingFactoryBean() throws Exception {
MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
methodInvokingFactoryBean.setTargetClass(KeyMaster.class);
methodInvokingFactoryBean.setTargetMethod("dec");
methodInvokingFactoryBean.setArguments(new String[] {zookeeperSettingHolder().getPassword(), zookeeperSettingHolder().getSecretKey()});
methodInvokingFactoryBean.afterPropertiesSet();
return methodInvokingFactoryBean;
}
@Bean(destroyMethod = "close")
public DataSource dataSource() throws Exception {
DataSource dataSource = new DataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl(zookeeperSettingHolder().getDataBase());
dataSource.setUsername(zookeeperSettingHolder().getUser());
dataSource.setPassword((String) methodInvokingFactoryBean().getObject());
return dataSource;
}
@Bean
public ConnectionDB connectionDB() throws Exception {
ConnectionDB connectionDB = new ConnectionDB();
connectionDB.setDataSource(dataSource());
return connectionDB;
}
}
在项目中,我使用注释 @Component 和 @Autowired
我添加了所有依赖项,在 Spring.io 网站上创建了项目本身,我不记得具体了,在那里你选择了必要的依赖项,等等。
应用类
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"com.ex.calc"})
public class CalcApplication {
public static void main(String[] args) {
SpringApplication.run(CalcApplication .class, args);
}
}
我正在尝试开始,但出现错误
Caused by: java.lang.NullPointerException: null
at com.ex.calc.dao.AbstractObjectFactory.<init>(AbstractObjectFactory.java:21) ~[classes/:na]
at com.ex.calc.dao.GetTotalModelDAO.<init>(GetTotalModelDAO.java:28) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
同时,GetTotalModelDAO 使用 Lombok 库中的 @Component 和 @NoArgsConstructor 注释进行标记。
如果你从上到下,那么他对我的控制器发誓
Error creating bean with name 'restControllerGetRate': Unsatisfied dependency expressed through field 'commonLogicClass'
控制器有一个 CommonLogicClass 声明,并且还标有 @Component
@Autowired
private CommonLogicClass commonLogicClass;
然后他自然而然的发誓
Error creating bean with name 'commonLogicClass': Unsatisfied dependency expressed through field 'getTotalModelDAO'
在 CommonLogicClass 类中有一个声明 GetTotalModelDAO
@Autowired
private GetTotalModelDAO getTotalModelDAO;
并低于错误
Error creating bean with name 'getTotalModelDAO' defined in file [C:\Users\user124\Desktop\demo\target\classes\com\ex\calc\dao\GetTotalModelDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ex.calc.dao.dao.GetTotalModelDAO]: Constructor threw exception; nested exception is java.lang.NullPointerException
我不明白为什么它会为 null 以及如何初始化组件。我读了很多东西,尝试了一切,到处都是如此简单,似乎可以启动,不需要任何额外的东西,但这里一切都是直的,一个管道((
public class GetTotalModelDAO extends AbstractObjectFactory<TotalModel> {
抽象对象工厂:
@Getter
public abstract class AbstractObjectFactory<T> extends ConnectionDB implements
ObjectFactory {
private Connection connection;
{
try {
connection = getDataSource().getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public abstract T getObject(Map<String, Object> params);
}
它只会继承 AppConfig 中的 ConnectionDB bean
@Bean
public ConnectionDB connectionDB() throws Exception {
ConnectionDB connectionDB = new ConnectionDB();
connectionDB.setDataSource(dataSource());
return connectionDB;
}
哪个是单例
public class ConnectionDB {
private static DataSource dataSource;
private static volatile ConnectionDB instance;
public static ConnectionDB getInstance() {
ConnectionDB localInstance = instance;
if (localInstance == null) {
synchronized (ConnectionDB.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new ConnectionDB();
}
}
}
return localInstance;
}
public static DataSource getDataSource() {
return dataSource;
}
public static void setDataSource(DataSource dataSource) {
ConnectionDB.dataSource = dataSource;
}
}
请提供建议,也许我以某种方式错误配置了一些东西。如果您需要更多信息,请说出来。
Spring IoC 在读取 AppConfig 之后,创建一个 ConnectionDB 类的实例,该类知道 DataSource:
然后,在某处创建了一个新对象——AbstractObjectFactory 类的一个实例,它扩展了 ConnectionDB 类,这个新对象也可以称为 ConnectionDB 类的对象,只是这个新对象对 DataSource 一无所知。在 getDataSource 方法返回 null 的 AbstractObjectFactory 初始化程序中抛出 NullPointerException。
我没有看到所有代码,但我假设 AbstractObjectFactory 可以删除为不必要的,并添加到 GetTotalModelDAO: