- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:这是针对常见问题的规范答案。
我有一个 Spring @Service
类 (MileageFeeCalculator
),它有一个 @Autowired
字段 (rateService
) ,但当我尝试使用它时,该字段为 null
。日志显示 MileageFeeCalculator
bean 和 MileageRateService
bean 均已创建,但每当我尝试调用 时,都会收到
方法。为什么 Spring 不 Autowiring 该字段?NullPointerException
我的服务 bean 上的 >mileageCharge
Controller 类:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = new MileageFeeCalculator();
return calc.mileageCharge(miles);
}
}
服务等级:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- should be autowired, is null
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile()); // <--- throws NPE
}
}
服务 bean 应该在 MileageFeeCalculator
中 Autowiring ,但事实并非如此:
@Service
public class MileageRateService {
public float ratePerMile() {
return 0.565f;
}
}
当我尝试 GET/mileage/3
时,出现以下异常:
java.lang.NullPointerException: null
at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge(MileageFeeCalculator.java:13)
at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee(MileageFeeController.java:14)
...
最佳答案
注释为 @Autowired
的字段为 null
,因为 Spring 不知道您使用 new 创建的
并且不知道如何 Autowiring 它。MileageFeeCalculator
的副本
The Spring Inversion of Control (IoC) container具有三个主要逻辑组件:可供应用程序使用的组件(bean)的注册表(称为 ApplicationContext
)、配置器系统,通过匹配依赖关系将对象的依赖关系注入(inject)到对象中上下文中包含 bean,以及一个依赖关系求解器,它可以查看许多不同 bean 的配置并确定如何按必要的顺序实例化和配置它们。
IoC 容器并不神奇,它无法了解 Java 对象,除非您以某种方式通知它。当您调用 new 时,JVM 会实例化新对象的副本并将其直接交给您 - 它永远不会经历配置过程。您可以通过三种方式配置 Bean。
我已使用 Spring Boot 发布了所有这些代码,地址为 this GitHub project ;您可以查看每种方法的完整运行项目,以了解使其发挥作用所需的一切。 带有 NullPointerException
的标记:nonworking
最好的选择是让 Spring Autowiring 所有的 beans;这需要最少的代码并且最容易维护。为了使 Autowiring 按照您想要的方式工作,还可以像这样 Autowiring MileageFeeCalculator
:
@Controller
public class MileageFeeController {
@Autowired
private MileageFeeCalculator calc;
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
return calc.mileageCharge(miles);
}
}
如果您需要为不同的请求创建服务对象的新实例,您仍然可以使用 the Spring bean scopes 来使用注入(inject).
通过注入(inject)@MileageFeeCalculator
服务对象来工作的标签:working-inject-bean
如果您确实需要使用 new
创建的对象进行 Autowiring ,您可以 use the Spring @Configurable
annotation along with AspectJ compile-time weaving注入(inject)你的对象。这种方法将代码插入到对象的构造函数中,提醒 Spring 它正在创建,以便 Spring 可以配置新实例。这需要在构建中进行一些配置(例如使用ajc
进行编译)并打开Spring的运行时配置处理程序(使用JavaConfig语法的@EnableSpringConfigured
)。 Roo Active Record 系统使用此方法来允许实体的新实例获取注入(inject)的必要持久性信息。
@Service
@Configurable
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService;
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile());
}
}
通过在服务对象上使用 @Configurable
来工作的标记:working-configurable
此方法仅适用于在特殊情况下与遗留代码交互。几乎总是最好创建一个 Spring 可以 Autowiring 并且遗留代码可以调用的单例适配器类,但也可以直接向 Spring 应用程序上下文请求 bean。
为此,您需要一个 Spring 可以为其提供对 ApplicationContext
对象的引用的类:
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getContext() {
return context;
}
}
然后您的遗留代码可以调用 getContext()
并检索它需要的 bean:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = ApplicationContextHolder.getContext().getBean(MileageFeeCalculator.class);
return calc.mileageCharge(miles);
}
}
通过在 Spring 上下文中手动查找服务对象来工作的标签:working-manual-lookup
关于java - 为什么我的 Spring @Autowired 字段为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56138692/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!