Java @自动连线对象获取空值

Java @自动连线对象获取空值,java,spring,jakarta-ee,autowired,Java,Spring,Jakarta Ee,Autowired,试图设置项目,但无法通过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");

试图设置项目,但无法通过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。 联系人:

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>

您需要从Spring上下文检索ContactDAO实例。您正在使用
new
关键字初始化自己

请参阅下面的链接

或者如果不是单元测试

ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
beanFactory.getBean("nameOfYourBean");

您需要在测试类的顶部添加以下内容:

@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
// in the root of the classpath
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
public class MyTest {
我假设JUnit4;我的疏忽


您确实需要在应用程序上下文中的某个位置使用上下文配置标记,但我在代码中没有看到您实际打开应用程序上下文文件并创建应用程序上下文的任何位置。通常,这是在测试的设置方法中完成的。如果您真的在某处创建了应用程序上下文,那么您的运气会更好。尝试在设置方法中从类路径中读取XML,看看是否有帮助。

为了使用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注释的类。它需要Spring3.0才能工作。在此之前,应在
applicationContext.xml
文件中添加以下行:

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

您需要在Spring配置中使用此选项,以便自动布线工作

xmlns:context="http://www.springframework.org/schema/context" 
....
<context:annotation-config/>
xmlns:context=”http://www.springframework.org/schema/context" 
....

@Component/@Repository
添加到DAO/DAOImpl。

您正在spring上下文之外创建POJO


如果你真的想“手动”实例化,你可以通过将
添加到你的配置中,然后用
@Configurable

注释
ContactDAOImpl
来解决这个问题。你能详细说明一下你的意思吗?我尝试将testrunner中的ContactDAO替换为@Autowired ContactDAO ContactDAO;但它也给了我一个NullPointerException。非常感谢,但这并没有利用@Autowired注释,是吗?有没有其他方法可以使用自动连线来完成这项工作?@Emil-它使用的是@Autowired。关键是依赖项是自动连接的,但根对象(ContactDao)需要spring管理才能实现这一点。如果您希望spring在显式使用new时自动连接bean,那么请查看@Configurable注释。感谢您的解释!现在我得到了一个NoSuchBeanDefinitionException:没有为依赖项找到[org.hibernate.SessionFactory]类型的匹配bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项注释:{@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=sessionFactory)}。现在,正如您在HSR-servlet.xml中所看到的,声明了SessionFactorybean。我还用我的DAOImpl更新了原来的帖子,这对我来说合适吗?我遗漏了什么?@eml您需要编写一个
applicationContext.xml
来告诉spring如何实例化您的SessionFactory。该文件还将告诉Spring和Hibernate如何在bean和
web.xml
文件之间建立链接。有关更多信息,请参阅和。我认为我的HSR-servlet.xml本质上是一个applicationContext文件。这是我第一次制作SpringMVC而不是Wicket应用程序,因为我一直使用applicationContext。我来试试这个。谢谢你的帮助。很抱歉我的类有误导性,它不是一个真正的testclass,只是一个名为TestRunner的类,我创建它是为了尝试这个功能。@ContextConfiguration是否适用?不,根据Michael Borgwart的回答,您需要在context.xml中输入。有关编辑的spring配置文件,请参阅我的原始帖子。问题仍然存在。我想这与此有关,我将尝试一下。我试图编辑我的spring配置,但问题仍然存在。我已经用新的配置编辑了我原来的帖子。@Emil:嗯,这就是导致自动连线失败的原因,但我想还有其他原因。可能是重复的
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);
}
<context:component-scan base-package="se.hsr.web" />
xmlns:context="http://www.springframework.org/schema/context" 
....
<context:annotation-config/>