`
pupi
  • 浏览: 435662 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

解决spring问题(Unsatisfied dependency)的意外发现

阅读更多
前几天在做一个Dao的单元测试的时候,碰到了一个spring的错误。如下:

引用
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'my.demo.dao.UUIDClassDaoTest': Unsatisfied dependency expressed through bean property 'UUIDClassDao': Set this property value or disable dependency checking for this bean.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
.checkDependencies(AbstractAutowireCapableBeanFactory.java:1019)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
populateBean(AbstractAutowireCapableBeanFactory.java:839)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:273)
at org.springframework.test.AbstractDependencyInjectionSpringContextTests.
injectDependencies(AbstractDependencyInjectionSpringContextTests.java:179)
at org.springframework.test.AbstractDependencyInjectionSpringContextTests.
prepareTestInstance(AbstractDependencyInjectionSpringContextTests.java:158)
at org.springframework.test.AbstractSingleSpringContextTests.setUp(Abstrac
tSingleSpringContextTests.java:88)
at junit.framework.TestCase.runBare(TestCase.java:128)


我的Dao单元测试类继承自 AbstractTransactionalDataSourceSpringContextTests
这个类,它可以提供对springContext的支持。

从errorstack中看,好像是Dao中的属性没有设置好。 所以, 我检查了代码,Dao中 定义了属性 uUIDClassDao,并且提供了set方法,如下:
	private UUIDClassDao uUIDClassDao = null;
	public void setUUIDClassDao(UUIDClassDao uUIDClassDao) {
		this.uUIDClassDao = uUIDClassDao;
	}     


在Spring context文件中,定义了如下的bean。

	<bean id="uUIDClassDao" class="my.demo.dao.hibernate.UUIDClassDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>   


看起来没问题呀,bean的id和dao中定义的属性都是 uUIDClassDao,通过把autowire模式设置成 AUTOWIRE_BY_NAME ,应该我的dao测试类会被自动注入uUIDClassDao这个bean的。

可是很意外,这并没有发生。What’s the problem ?

我又仔细看了看error stack,忽然发现,提示的是 “Unsatisfied dependency expressed through bean property 'UUIDClassDao':”。注意,不是uUIDClassDao,而是UUIDClassDao。

难道Spring会把uUIDClassDao识别成 UUIDClassDao ?
我跟踪了spring的代码,发现,spring在拿到单元测试dao的时候,用了Introspector.getBeanInfo(Class class0) 去得到对象的属性。的的确确,通过这种方式拿到的属性名是 UUIDClassDao,而不是uUIDClassDao。

为了再次验证,我写了一个简单的测试程序:

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;



public class AppBeanInfo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		
		BeanInfo info = Introspector.getBeanInfo(MyReflection.class);
		for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
			System.out.println(pd.getName());
		}
		BeanInfo info2 = Introspector.getBeanInfo(MyReflection2.class);
		for (PropertyDescriptor pd : info2.getPropertyDescriptors()) {
			System.out.println(pd.getName());
		}
	}

}

public class MyReflection {
	String mRef;

	public String getMRef() {
		return mRef;
	}

	public void setMRef(String ref) {
		mRef = ref;
	}
	
}


public class MyReflection2 {
	String mmRef;

	public String getMmRef() {
		return mmRef;
	}

	public void setMmRef(String mmRef) {
		this.mmRef = mmRef;
	}
	
}


输出结果是
MRef
class
class
mmRef
也就是对mRef这种字段,用自省识别出来的属性名竟然是MRef。

so, 在程序中尽量不要定义 uUIDClassDao这种属性,而用uuidClassDao。因为可能在你不知道的地方,uUIDClassDao已经被识别成了 UUIDClassDao。

分享到:
评论
8 楼 二十一 2007-08-12  
很有用,支持楼主
7 楼 打倒小日本 2007-06-20  
以前也遇到过这种问题,总算知道是为什么了,谢谢楼主!
6 楼 pupi 2007-06-19  
downpour 写道
连续两个帖子发现这种JavaBean的规范问题,还套了那么大一个标题。

难道不会搜索一下吗?


拜托看清楚帖子再说话。

我拿unsatisfied dependency在论坛中搜了,没有相近的问题。
问题的关键是,我一开始并不清楚这问题和javabean规范有关。

而且并不是所有javaeyer都像你那么牛,每个规范都那么熟。

发这个帖子,只是希望今后有朋友碰到相近的问题,用 Unsatified dependency搜索,还能发现原来是javabean规范导致的问题。

如果大家觉得没有帮助,可以把这个帖子投成隐藏帖。让其只存放在blog中。
5 楼 downpour 2007-06-19  
连续两个帖子发现这种JavaBean的规范问题,还套了那么大一个标题。

难道不会搜索一下吗?
4 楼 pupi 2007-06-19  
galaxystar 写道
注意下规范就行了,很多框架都是默认的按照首字母大写来做的!


之前确实不知道java会把一个mRef的field,识别成MRef的属性。
3 楼 pupi 2007-06-19  
decapitalize是一个静态方法,将一个字符串的首字母从大写变成小写。
getBeanInfo调用了几次这个方法,但是好像和我说的不完全是一件事情呢。下面是这个方法的说明。

Utility method to take a string and convert it to normal Java variable name capitalization. This normally means converting the first character from upper case to lower case, but in the (unusual) special case when there is more than one character and both the first and second characters are upper case, we leave it alone.

Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays as "URL".

2 楼 galaxystar 2007-06-19  
注意下规范就行了,很多框架都是默认的按照首字母大写来做的!
1 楼 joachimz 2007-06-19  
这是javabean规范的一部分,用于处理缩写等情况。建议可以去看看java.beans.Introspector decapitalize的源代码

相关推荐

    spring boot整合mybatis-plus启动报错问题及解答.pdf

    错误信息通常类似于"Error starting ApplicationContext",并提示"UnsatisfiedDependencyException",这表明Spring框架在初始化bean时遇到了未满足的依赖。在这种情况下,错误通常与Mapper接口的自动扫描和配置有关...

    25号05: Spring MVC1课堂内容

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(Model-View-Controller,MVC)结构的Web应用程序提供了强大的支持。在"25号05:Spring MVC1课堂内容"中,我们可以推测这是一个教学资源,...

    windows中文分词系统(支持web的post调用)

    本文将详细介绍一款支持HTTP POST调用的Windows中文分词系统,帮助读者理解其工作原理、使用方法以及相关编码问题。 一、系统概述 这款Windows中文分词系统设计为Web服务,允许通过HTTP POST请求进行调用,适用于...

    FusionMaps_Enterprise.rar

    FusionMaps 是一款专业的数据可视化工具,主要用于创建交互式的地图图表。它将复杂的数据转换为易于理解的地理信息图形,广泛应用于商业智能、数据分析和报告等领域。`FusionMaps_Enterprise.rar` 可能是该软件的...

    embedded driver cd code

    总线驱动作为设备驱动的父级,负责发现、枚举和配置连接在总线上的设备。 七、实例分析 光盘中的实例代码可能包含以下部分: - 简单的字符设备驱动示例,如LED控制或串口通信。 - 块设备驱动示例,如虚拟磁盘驱动...

    javaweb各种框架组合案例(四):maven+spring+spr….docx

    - `org.springframework.beans.factory.UnsatisfiedDependencyException`: 这表明Spring容器在尝试创建`userServiceImpl`时未能满足其依赖关系。 - `org.springframework.beans.factory.BeanCreationException`: ...

    基于springboot+mybatis实现的外卖订餐系统源码+项目说明(毕设).zip

    - org.springframework.beans.factory.UnsatisfiedDependencyException 不满足依赖异常 - org.springframework.beans.factory.BeanCreationException - org.springframework.beans.BeanInstantiationException - org...

    JPA爬坑.pdf

    接下来,我们遇到了另一个问题,即在创建bean时出现异常,具体是“Unsatisfied dependency expressed through field 'userService'”。这意味着Spring无法满足依赖注入,因为依赖的`userService`没有被正确地初始化...

    SPRING API 2.0.CHM

    All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory....

    Java框架知识点学习笔记

    最后,如果在运行时出现“UnsatisfiedDependencyException”,表示Spring无法满足依赖注入的要求。这通常是因为bean的构造参数类型与配置文件中的声明不一致。例如,配置文件中可能有如下错误代码: ```xml 杨凯" /&gt;...

    delphi问题常见解决

    可以解决问题,这样就正确地将`string`类型赋值给了`TStrings`的`.Text`属性。 理解并解决这些常见的Delphi问题对于提高开发效率至关重要。当遇到类似问题时,检查语法、类型匹配、方法声明以及编译器状态都是有效...

    Laravel开发-uuid

    use Ramsey\Uuid\Exception\UnsatisfiedDependencyException; class UuidGenerator { public static function generate() { try { return Uuid::uuid4(); } catch (UnsatisfiedDependencyException $e) { // ...

    FindBugs规则整理_中文版.pdf

    FindBugs规则整理中文版.pdf FindBugs是一款静态代码分析工具,旨在帮助开发者检测Java...FindBugs规则整理中文版.pdf文件提供了多个方面的安全性和代码质量问题的解决方法,旨在帮助开发者编写更加安全、可靠的代码。

    SpringBoot 整合 JMSTemplate的示例代码

    在高版本 SpringBoot(2.0 以上)中,添加 activemq 连接池依赖项时可能会出现 Error creating bean with name 'xxx': Unsatisfied dependency expressed through field 'jmsTemplate' 的错误,可以将 activemq 连接...

    findbugs报告问题含义

    `FindBugs` 是一款静态代码分析工具,用于检测 Java 代码中的潜在错误和不良实践。这份报告列举了一些常见的 `FindBugs` 报告问题,让我们...在开发过程中定期运行 `FindBugs` 分析可以帮助及时发现和修复这些问题。

    精彩编程与编程技巧-Win Api在VB中的妙用...

    ### 知识点一:Windows API 在 VB 中的应用 Windows API(Application Programming Interface)是微软为 Windows 操作系统提供的一组编程接口函数集合,通过这些函数可以实现对 Windows 操作系统的底层控制。...

    Eclipse 搭建C/C++开发环境 cdt-master-7.0.2

    Eclipse 是一个强大的开源集成开发环境(IDE),广泛用于Java应用程序的开发,但它同样支持其他编程语言,包括C和C++。CDT(C/C++ Development Tooling)是Eclipse的一个插件集,专为C和C++开发者提供了一整套的开发...

    FindBugs规则整理_中文版

    通过分析程序的字节码,FindBags能够帮助开发者发现潜在的问题,提高软件的质量和安全性。本文将详细介绍FindBugs 1.3.9版本中的部分规则,主要涉及安全性和编码实践方面。 #### 安全性相关规则 ##### Dm:...

    人工智能-机器学习-软件产品创新中的领先用户识别研究.pdf

    为了解决这个问题,麻省理工学院斯隆管理学院的Hippel教授提出了领先用户理论。他发现领先用户能为企业提供宝贵的创新方向,因为他们预示着市场的未来需求。 接着,文档强调在实施领先用户方法论的过程中,识别领先...

    subscription-manager-rhsm-1.24.42-1.el7.centos.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

Global site tag (gtag.js) - Google Analytics