用于字段注入的空指针

Posted

技术标签:

【中文标题】用于字段注入的空指针【英文标题】:Null pointer for field injection 【发布时间】:2015-12-29 21:40:06 【问题描述】:

我在这里遗漏了我所做的基本事情,我很抱歉这个问题,基本上我试图从Autowring for @Sevice field failed 模拟我自己的问题,但是以非常简单的形式,我试图以某种方式故意提出错误建立理解,但是当它到来时,我无法处理它。

x-servlet.xml

<beans xmlns= ...... >
   <context:component-scan base-package="com" /> 
     <context:annotation-config />
    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />   
    </bean>
</beans>

com.domain

Boss.java

package com.domain;
public class Boss 
    private String name;
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    

员工:

package com.domain;
import org.springframework.beans.factory.annotation.Autowired;
public class Employee 
    @Autowired
    private Boss boss;
     String nameBoss;

    public String getNameBoss() 
       nameBoss = this.boss.getName();
       return nameBoss;
    


com.controller

controller.java :

package com.controller
import com.domain.Boss;
import com.domain.Employee;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class controller     
    @RequestMapping("/try")
    public String show()  
        Boss b = new Boss();
        b.setName(" hans");

         Employee e =  new Employee();  
          String bossName = e.getNameBoss();            
        System.out.println(bossName );      

    return "";

 

我是这么想的,

String bossName = e.getNameBoss();

在控制器中不会为空,因为 BossEmployee 构造之前已经初始化,但我错了..

【问题讨论】:

老板对象与员工对象没有关系。它们只是两个独立的对象。如果您指的是@autowire 魔法,那么这不是它应该如何工作的。 @autowire 将从上下文文件中指定的依赖项中注入依赖项。 这里有一些问题。像 Spring 这样的 IoC 容器将为您管理一些对象,如果这样做,您不能自己实例化它们。如果你想自动装配一个对象,它必须是一个容器管理的对象,这意味着你必须用@Service之类的东西来注释它。如果它是容器管理的东西,那么您不应该自己实例化它。 感谢大家的回复,在 Spring Core 中,我也尝试模拟这一点,唯一的区别是,我可以从 ApplicationContext#getBean 加载 bean,但在 Spr 中。 MVC,我如何为那些 Employee & Boss .., 加载 bean Why is my Spring @Autowired field null?的可能重复 【参考方案1】:

您确定要对域对象进行依赖注入 (DI) 吗?这不是典型的用法...对于 DI,容器必须创建实例 - 所以不要使用 new 运算符...

您可以使用 ApplicationContext.getBean() 替换 new 运算符(如果 bean 是原型类型),但正如我上面所说的 - 即使您知道如何创建此类 bean,Spring 应该如何知道 Boss 的哪个实例@想在Employee中拥有?

您需要的第一件事是控制器中的应用程序上下文,它应该可以添加接口org.springframework.context.ApplicationContextAware,或者您可以简单地使用autowire it,然后以“标准”方式使用它(ac 是 ApplicationContext):

    Boss b = ac.getBean(Boss.class);
    Employee e = ac.getBean(Employee.class, b);

我将BossEmployee 标记为:

@Component
@Scope("prototype")
public class Boss 

...



@Component
@Scope("prototype")
public class Employee 

    // @Autowire - wrong
    Boss boss;

    public Employee(Boss boss) 
        this.boss = boss;
    

    ...

【讨论】:

我认为摆脱 new 运算符的唯一方法是从 Spring 的上下文中加载 bean,就像在 spring 核心中我们使用 ApplicationContext#getBean 一样,但如果我知道的话如何加载那些Employee & Boss.. 然后我想我可以摆脱那些new 操作员 感谢您的编辑,我通常使用的 ApplicationContext 的实现类是ClassPathXmlApplicationContext(...);,但它有一个参数是指向上下文配置,如果我尝试ClassPathXmlApplicationContext(/WEB-INF/x-servlet.xml/) 那么它不会工作..,帮帮我兄弟.. 一定要先声明Boss & Employee&lt;bean...&gt;x-servlet.xml?? 不,你不需要,你有组件扫描,所以使用ComponentScope注解... 这意味着我必须创建自定义配置。对于豆子,现在我要给你投票,让我先了解一下。

以上是关于用于字段注入的空指针的主要内容,如果未能解决你的问题,请参考以下文章

SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结

外置 tomcat启动Spring Boot程序模式下解决过滤器注入bean的空指针问题

Spring MVC 项目中的空指针异常

用于登录Android Studio的实时firebase数据库上的空指针异常[重复]

在 customadapter 中设置 setAdapter() 的空指针

在 java xml 应用程序中初始化控制器时的空指针