@Autowired 对象获取空值

2023-11-26

尝试建立一个项目,但通过 Spring 自动装配对象失败。

package se.hsr.web;

public class TestRunner {

    public static void main(String[] args) {
        ContactDAO cd = new ContactDAOImpl();
        Contact contact = new Contact();
        contact.setFirstname("Zorro");
        cd.addContact(contact);
    }

}

package se.hsr.web;

当调用 cd.addContact 时,运行此命令会出现 NullPointerException。 ContactDaoImpl:

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ContactDAOImpl implements ContactDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public void addContact(Contact contact) {
        sessionFactory.getCurrentSession().save(contact);
    }

我的servlet 文件:

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan
        base-package="se.hsr.web"/>

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />  

     <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <bean id="contactDAOImpl"
        class="se.hsr.web.ContactDAOImpl"/>

    <context:annotation-config/>

</beans>

我的 hibernate.cfg.xml 文件:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <mapping class="se.hsr.web.Contact" />
    </session-factory>

</hibernate-configuration>

我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>HSRMVC</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>HSR</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>HSR</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

我认为错误是 SessionFactory 没有通过 @Autowired 正确初始化,但这是为什么呢?这可能是一个简单的目录结构/文件路径问题还是更复杂的问题?

提前致谢。

更新: 联系 DAOImpl 类:

@Repository
public class ContactDAOImpl extends HibernateDaoSupport implements ContactDAO{

    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    public void addContact(Contact contact) {
        sessionFactory.getCurrentSession().save(contact);
    }

为了使用 Spring 功能(自动装配、调用后构造方法或方面),您需要让 Spring 实例化实例而不是使用new.

例如:

public static void main(String[] args) {
    ApplicationContext context = AnnotationConfigApplicationContext("se.hsr.web")
    ContactDAO cd = (ContactDAO)context.getBean("contactDAOImpl");
    Contact contact = new Contact();
    contact.setFirstname("Zorro");
    cd.addContact(contact);
}

AnnotationConfigApplicationContext将扫描类中的类se.hsr.web打包为带有 Spring 注解的类。它需要 Spring 3.0 才能工作。在此之前,您应该在您的applicationContext.xml file:

<context:component-scan base-package="se.hsr.web" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Autowired 对象获取空值 的相关文章

随机推荐

  • 在 PHP 中格式化日期字符串

    如果我有一个代表日期的字符串 例如 2011 07 01 即 2011 年 7 月 1 日 我将如何以更易读的形式输出它 例如 1 July 2011 1 Jul 2011 month as three letters 另外 我怎样才能让它
  • 动画平滑的 CSS 网格列变化

    我正在使用 CSS 网格布局来定位网站上的各个部分 我用grid column x x and grid row x x 设置它们在页面上的位置和大小 它运作得非常好 现在我正在尝试制作两个网格列修复之间的平滑过渡动画 这是在屏幕尺寸发生变
  • 启动 Android Studio 时出错

    我在启动 android studio 时遇到这些错误 请任何人能为我提供解决方案 gt java lang RuntimeException gt com intellij ide plugins PluginManager Startu
  • 编译 helloworld.cu 时遇到问题

    在 Ubuntu 10 10 中编译这个 hello world 示例时 这是来自CUDA 示例 第 3 章 未提供编译说明 gt include
  • Flutter:刷新网络图像

    我是颤振的初学者 我正在寻找一种简单的方法来刷新网络图像 在这样的基本代码中 让 flutter 再次获取并绘制该图像的最简单方法是什么 在我的代码中 图像是来自安全摄像头的快照 因此每次获取时都会发生变化 但始终具有相同的 url 每次启
  • 如何从 Startup.cs 中的 XML 文件中提取配置设置

    我有一个startup cs 文件 我想从XML 文件中提取配置而不是appsetings json文件 ASP NET Core MVC 可以吗 如果您想使用appsettings xml相反 你可以参考我的博客文章here 引用文章中的
  • C++中字符串前面的“L”是什么意思?

    this gt textBox1 gt Name L textBox1 虽然它似乎可以在没有L 前缀的目的是什么 它的使用方式对于铁杆 C 程序员来说甚至没有意义 It s a wchar t文字 用于扩展字符集 维基百科有关于这个主题的一
  • 在 Pandas 中查找多列中的字符串

    我正在尝试查找多个列中是否存在字符串 如果字符串存在 我想返回 1 如果它不作为数据帧中的新系列 则返回 0 在搜索论坛后 我了解到可以使用 str contains 但我正在搜索 100 多个列 因此一次处理单个系列对我来说效率不高 如果
  • C++ 诡异的构造函数 [重复]

    这个问题在这里已经有答案了 可能的重复 为什么使用空括号调用不带参数的构造函数会出错 让我们有这个代码 class Foo Foo int 然后我们得到结果 int main Foo f1 Foo 5 1 OK explicit call
  • ASP .NET MVC 在每个字段级别禁用客户端验证

    我正在使用带有数据注释和 jQuery 验证插件的 ASP NET MVC 3 有没有办法标记某个字段 或某个数据注释 只能在服务器端进行验证 我有一个带有屏蔽插件的电话号码字段 正则表达式验证器在用户端变得疯狂 正则表达式只是一个自动防故
  • 无法让Python从不同的文件夹导入

    我似乎无法让 Python 在子文件夹中导入模块 当我尝试从导入的模块创建该类的实例时出现错误 但导入本身成功 这是我的目录结构 Server server py Models user py 这是server py的内容 from sys
  • 如何使用套接字通过互联网发送数据?

    我想通过桌面应用程序通过互联网发送数据 我对套接字了解一点 我已经在局域网内传输数据 但现在我想通过互联网传输数据 传输大量和少量数据的最佳方式是什么 我的系统已连接到可以访问互联网的服务器 我的系统的 IP 地址是动态的 我不知道如何将数
  • 计算数据帧组内的差异

    假设我有一个包含 3 列的数据框 日期 股票行情 值 没有索引 至少在开始时是这样 我有很多日期和股票行情 但每个 ticker date 元组是唯一的 但显然 相同的日期将显示在许多行中 因为它会出现在多个代码中 并且相同的代码会出现在多
  • 是否存在使用数据库 1:1 关系有意义的时候?

    前几天我在思考规范化 我突然想到 我想不出数据库中应该存在 1 1 关系的时候 Name SSN 我会把它们放在同一张桌子上 PersonID AddressID 再说一遍 同一张桌子 我可以想出无数个 1 多或多 多 带有适当的中间表 的
  • Perl 正则表达式中的转义特殊字符

    我正在尝试匹配 Perl 中的正则表达式 我的代码如下所示 my source Hello version Goodbye version my pattern Hello version if source m pattern print
  • 如何在 Android Javadoc 中引用 XML 文件? [复制]

    这个问题在这里已经有答案了 有没有办法使用 JavaDoc 链接来引用 Android XML 文件res folder 就像是 link res values custom strings xml link com yourApp R l
  • 如何备份SQL Server代理作业?

    如何备份和恢复 SQL Server 2005 代理作业计划 msdb 数据库是所有作业所在的地方 它是系统数据库之一
  • add2virtualenv(virtualenv 包装器)不适用于 scipy

    我想创建一个没有全局 python 包的 virtualenv 但具有共享的 scipy 发行版 安装 scipy 需要相当长的时间 我不想太频繁地走过场 所以我跑add2virtualenv Library Python 2 7 site
  • 如何通过不可靠的网络同步媒体播放?

    我希望我可以在一台计算机上播放音乐或视频 并让第二台计算机同步播放相同的媒体 例如 我可以同时听到两台计算机的扬声器的声音 这听起来并不好笑 我想通过 Wi Fi 来完成此操作 但 Wi Fi 有点不可靠 从算法上来说 解决这个问题的最佳方
  • @Autowired 对象获取空值

    尝试建立一个项目 但通过 Spring 自动装配对象失败 package se hsr web public class TestRunner public static void main String args ContactDAO c