广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring 父类变量注入失败的解决
  • 136
分享到

Spring 父类变量注入失败的解决

2024-04-02 19:04:59 136人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录spring 父类变量注入失败下面小记下这个过程Spring通过父类注入公用属性的技巧XML配置方式提取父类Annotation方式提取父类Spring 父类变量注入失败 昨天遇

Spring 父类变量注入失败

昨天遇到一个Action里面Service注入失败,换种说法应该说是根本没有发生注入,本来很简单的一个问题,但由于在项目中多个Action进行了继承,才最终导致了这个看似奇怪的问题。

下面小记下这个过程

收到同事问题,“有个Action请求一直调用报控指针,service一直是空的导致的!”

初步看了代码及配置,没有发现什么问题,起初怀疑是Action没有get方法所致,然后加上仍然无效;然后单步做了各种变量名的替换,一直一样问题 ,这过程中一直关注java代码确忽略了页面请求,通过页面请求发现代码真正逻辑是页面请求了一个子类Action的方法,而这个方法里面调用了父类的一个方法,此时父类里面的Service一直无法注入,对于上面所提的这种需求,实际上是需要在子类做Spring注入的同时也进行父类的Spring注入,那么这种需要这样的配置:


<bean id="****Action" class="com.**.**.contrl.**.mgr.action.**Action" scope="prototype" parent="termCommonAction">
  <property name="orderVerifyapiFacade" ref="ord.bizprov.orderVerifyApiFacade"/>
  <property name="orderListQryApiFacade" ref="ord.query.orderListQryApiFacade"/>
  <property name="channelQryApiFacade" ref="cfguse.channel.channelQryApiFacade" />
</bean> 

经过上面的设置以后,请求子类的Action方法,子类方法中调用父类方法时,就不会出现父类不发生注入的问题了。

Spring通过父类注入公用属性的技巧

XML配置方式提取父类

在使用Spring + Hibernate框架,或者ssh2等框架的时候,在开发中只有一个基本的DAO是现在的非常流行的做法。然后,在看过多份这种代码以后,都是在每个业务类中声明了一个DAO属性,并且在Bean配置中,对每个业务类分别注入DAO。具体情形示例如下:

BaseDAO代码:


public class BaseDAO {
 public String service() {
  return "Success!";
 }
}

Services代码:


//第一个业务类
public class ServiceA {
 public String service() {
  return baseDAO.service();
 } 
 protected BaseDAO baseDAO; 
 public void setBaseDAO(BaseDAO baseDAO) {
  this.baseDAO = baseDAO;
 }
}
 
//第二个业务类
public class ServiceB {
 public String service() {
  return baseDAO.service();
 }
 
 protected BaseDAO baseDAO; 
 public void setBaseDAO(BaseDAO baseDAO) {
  this.baseDAO = baseDAO;
 }
}

Spring的Bean配置如下:


<bean id="baseDAO" class="com.watson.BaseDAO" />
<bean id="serviceA" class="com.watson.ServiceA">
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceB" class="com.watson.ServiceB">
 <property name="baseDAO" ref="baseDAO" />
</bean>

这样的做法是现在的主流。这样做不是说那里错了,还是那句老话:这样做肯定不优美,谁让人有时候是一根筋呢?

能够想到的办法是用一个父类来包含一些业务层公用的业务逻辑和属性。所以可以将上面的代码和配置。

Services代码改写如下:


//所有业务类的父类
public class BaseService {
 protected BaseDAO baseDAO; 
 public void setBaseDAO(BaseDAO baseDAO) {
  this.baseDAO = baseDAO;
 }
}
//第一个业务类
public class ServiceA extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}
//第二个业务类
public class ServiceB extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}

Spring的Bean配置改写如下:


<bean id="baseDAO" class="com.watson.BaseDAO" />
<bean id="BaseService" class="com.watson.BaseService" />
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceA" class="com.watson.ServiceA" />
<bean id="serviceB" class="com.watson.ServiceB" />

这样一来是不简洁了很多?尤其在实际项目有太多Bean的时候。然后,这里不会达到我们预想的结果,因为这里会出现如下的错误:

exception:

org.springframework.WEB.util.NestedServletException: Request processing failed; nested exception is

java.lang.NullPointerException

......

root cause:

java.lang.NullPointerException:......

而出错代码就是每个业务中调用baseDAO的那行代码。这说明注入失败了。翻阅Spring的Bean注入详解之后,很快就可以找应该设置子类Bean配置的parent属性。所以这里可以修改设置。

Spring的Bean配置改写如下:


<bean id="baseDAO" class="com.watson.BaseDAO" />
<bean id="BaseService" class="com.watson.BaseService" />
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceA" class="com.watson.ServiceA" parent="baseService" />
<bean id="serviceB" class="com.watson.ServiceB" parent="baseService" />

这个时候再运行,就不会报错了。原理是:在Spring的子类Bean配置中,其parent属性作用是指定其父类,并继承父类的注入属性。不仅如此,子类还可以修改或者覆盖父类的属性值。例如上述代码中的子类修改父类的baseDAO到属性:


<bean id="BaseService" class="com.watson.BaseService" />
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceA" class="com.watson.ServiceA" parent="baseService" />
<property name="baseDAO" ref="baseDAO2" />
</bean>

而对于父类的List等集合属性,子类可以继承父类的值,并且在其基础上进行增加新的值:


<bean id="BaseService" class="com.watson.BaseService" />
 <property name="listValue">  
  <list>  
   <value>listValue1</value>  
   <value>listValue2</value>  
  </list>  
 </property> 
</bean>
<bean id="serviceA" class="com.watson.ServiceA" parent="baseService" />
 <property name="listValue">  
  <list>  
   <value>listValue3</value>  
   <value>listValue4</value>  
  </list>  
 </property> 
</bean>

Annotation方式提取父类

上面的方法是在XML配置文件中进行的配置。而对现在Spring3流行的Annotation方式,其实更加的方便,完整示例如下:

BaseDAO代码:


@Component
public class BaseDAO {
 public String service() {
  return "Success!";
 }
}

Services代码:


//所有业务类的父类
public class BaseService {
 @Autowired
 protected BaseDAO baseDAO;
}
 
//第一个业务类
@Component
public class ServiceA extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}
//第二个业务类
@Component
public class ServiceB extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}

Action层代码:


@Controller
@RequestMapping(value = "/testaction")
public class TestAction {
 @Autowired
 private ServiceA service;
 
 @RequestMapping(value = "/")
 public @ResponseBody String home(Model model) {
  return service.service();
 }
}

这里根本就不需要进行parent属性子类的配置,可以完美的提取父类,并且可以顺利的使用父类的公用属性。至于原理,没有去看源码的处理方式,估计和上述XML配置是异曲同工的,只是在这里增加了对父类的检测。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Spring 父类变量注入失败的解决

本文链接: https://www.lsjlt.com/news/136359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring 父类变量注入失败的解决
    目录Spring 父类变量注入失败下面小记下这个过程Spring通过父类注入公用属性的技巧XML配置方式提取父类Annotation方式提取父类Spring 父类变量注入失败 昨天遇...
    99+
    2022-11-12
  • Spring静态变量/构造函数注入失败的解决方案
    目录1、案例1:Spring对静态变量的注入为空2、案例2:在构造函数中使用Spring容器中的Bean对象,得到的结果为空补充1、案例1:Spring对静态变量的注入为空 案例代码...
    99+
    2022-11-12
  • Spring自动注入失败的解决方法
    目录Spring自动注入失败如何解决?回答注入你的bean使用@Configurable手动查找bean:不推荐Spring自动注入失败如何解决? 我有一个被Spring @Ser...
    99+
    2022-11-12
  • RocketMQTemplate 注入失败的解决
    RocketMQTemplate 注入失败 在使用rocketmq 发送消息时,会发现 @Autowired private RocketMQTemplate rocketM...
    99+
    2022-11-12
  • 解决netty中spring对象注入失败的问题
    目录netty中spring对象注入失败发现了问题所在在netty中注入spring成份可以通过以下方式netty中spring对象注入失败 今天在做项目的时候发现在netty中注入...
    99+
    2022-11-13
  • 如何解决Spring自动注入失败的问题
    小编给大家分享一下如何解决Spring自动注入失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring自动注入失败如何解决?我有一个被Spring @...
    99+
    2023-06-15
  • netty中spring对象注入失败怎么解决
    本文小编为大家详细介绍“netty中spring对象注入失败怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“netty中spring对象注入失败怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。net...
    99+
    2023-06-29
  • springcloud引入spring-cloud-starter-openfeign失败的解决
    目录引入spring-cloud-starter-openfeign失败引入下面jar包总是报错版本信息如下解决办法引入spring-cloud-starter-openfeign后...
    99+
    2022-11-13
  • Spring对静态变量无法注入的解决方案
    Spring对静态变量无法注入 问题 今天在学习的过程中想写一个连接和线程绑定的JDBCUtils工具类,但测试时发现一直报空指针异常,上网查了之后Spring并不支持对静态成员变量...
    99+
    2022-11-12
  • 在zuulFilter中注入bean失败的解决方案
    zuulFilter注入bean失败 一、为什么要用到这个 上周想实现在网关层 zuul 实现用户认证操作,即需要在网关过滤器中调用其他的微服务,按常规做法在 filter 中用 @...
    99+
    2022-11-12
  • springboot使用@value注入配置失败的解决
    目录springboot使用@value注入配置文件失败问题解决方向一问题解决方向二@Value注入失败,注入值为null的问题大概就是下面这样结果不知道为什么,@Value注入一直...
    99+
    2022-11-12
  • 如何解决Spring对静态变量无法注入的问题
    这篇文章主要讲解了“如何解决Spring对静态变量无法注入的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决Spring对静态变量无法注入的问题”吧!Spring对静态变量无法注入...
    99+
    2023-06-20
  • Springboot的spring-boot-maven-plugin导入失败的解决方案
    Springboot spring-boot-maven-plugin导入失败 因为之前换了本地仓库,再打开项目的时候就变成红色了,问题是其他依赖都导好了,只有这个家伙红的刺眼。 找...
    99+
    2022-11-12
  • mybatis批量更新插入,解决失败的问题
    update sys_issue first_class = #{item.first}, second_class = #{item.second}, up...
    99+
    2023-09-01
    mybatis mysql java
  • 深入了解Python中的变量类型标注
    目录一、概述1、描述2、常用的数据类型3、mypy模块二、使用1、基本使用2、函数参数返回值添加类型标注3、混合类型检查改进4、类型别名更改一、概述 1、描述 变量类型注解是用来对变...
    99+
    2023-05-15
    Python变量类型标注 Python 类型标注 Python标注
  • @Autowired自动注入接口失败的原因及解决
    目录@Autowired 自动注入接口失败可以这样做@Autowired 自动注入失败报空指针异常今天就遇到了这个问题 @Autowired 自动注入接口失败 有个自动注入...
    99+
    2022-11-13
  • Springboot的spring-boot-maven-plugin导入失败的问题如何解决
    本篇内容介绍了“Springboot的spring-boot-maven-plugin导入失败的问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2023-06-20
  • Spring @Cacheable注解类内部调用失效的解决方法
    这期内容当中小编将会给大家带来有关Spring @Cacheable注解类内部调用失效的解决方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Cacheable注解类内部调用失效如果你只是想使...
    99+
    2023-06-22
  • Spring @Cacheable注解类内部调用失效的解决方案
    目录@Cacheable注解类内部调用失效@Cacheable注解缓存方法内部调用方法一方法二方法三方法四@Cacheable注解类内部调用失效 如果你只是想使用一个轻量级的缓存方案...
    99+
    2022-11-12
  • spring cloud中Feign导入jar失败的问题及解决方案
    目录Feign导入jar失败的问题网上很多人在使用的feign时在pom.xml中填写的是用以下的方式也能够完美导入feignSpringcloudfeign异常报错及解决报错异常如...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作