RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 939525
Accepted
Владислав
Владислав
Asked:2020-02-01 20:04:23 +0000 UTC2020-02-01 20:04:23 +0000 UTC 2020-02-01 20:04:23 +0000 UTC

Spring Boot 无法启动 - 无法实例化:构造函数抛出异常;嵌套异常是 java.lang.NullPointerException

  • 772

我正在尝试建立一个 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-mvc
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Александр Березовский
    2020-02-01T20:49:36Z2020-02-01T20:49:36Z

    Spring IoC 在读取 AppConfig 之后,创建一个 ConnectionDB 类的实例,该类知道 DataSource:

    @Bean
    public ConnectionDB connectionDB() throws Exception {
        ConnectionDB connectionDB = new ConnectionDB();
        connectionDB.setDataSource(dataSource());
        return connectionDB;
    }
    

    然后,在某处创建了一个新对象——AbstractObjectFactory 类的一个实例,它扩展了 ConnectionDB 类,这个新对象也可以称为 ConnectionDB 类的对象,只是这个新对象对 DataSource 一无所知。在 getDataSource 方法返回 null 的 AbstractObjectFactory 初始化程序中抛出 NullPointerException。

    我没有看到所有代码,但我假设 AbstractObjectFactory 可以删除为不必要的,并添加到 GetTotalModelDAO:

    @Autowired
    private ConnectionDB connectionDb;
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5