用于字段注入的空指针
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();
在控制器中不会为空,因为 Boss 在 Employee 构造之前已经初始化,但我错了..
【问题讨论】:
老板对象与员工对象没有关系。它们只是两个独立的对象。如果您指的是@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);
我将Boss
和Employee
标记为:
@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
,<bean...>
,x-servlet.xml
??
不,你不需要,你有组件扫描,所以使用Component
和Scope
注解...
这意味着我必须创建自定义配置。对于豆子,现在我要给你投票,让我先了解一下。以上是关于用于字段注入的空指针的主要内容,如果未能解决你的问题,请参考以下文章
SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结
外置 tomcat启动Spring Boot程序模式下解决过滤器注入bean的空指针问题
用于登录Android Studio的实时firebase数据库上的空指针异常[重复]