java.awt.Color+spring autowire 问题解决

本文记录了解决使用JCaptcha验证码框架时遇到的颜色配置问题。在从JDK1.5升级到JDK1.6后,颜色配置出现了异常。通过深入分析Spring的加载过程并调整参数类型,最终解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目里用了开源验证码框架[url=http://jcaptcha.sourceforge.net/]JCaptcha[/url],它通过配置文件指定图片颜色,配置如下

<bean id="softBlue" class="java.awt.Color" >
<constructor-arg index="0"><value>0</value></constructor-arg>
<constructor-arg index="1"><value>255</value></constructor-arg>
<constructor-arg index="2"><value>0</value></constructor-arg>
</bean>

[b]问题1[/b]
在jdk 1.5.08下没有问题,但是当升级到jdk 1.6.10时,初始化失败,报错显示为
java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue
at java.awt.Color.testColorValueRange(Color.java:298)
at java.awt.Color.<init>(Color.java:382)
at java.awt.Color.<init>(Color.java:357)

java.awt.Color的constructor有两个
 public Color(int r, int g, int b)  //int
public Color(float r, float g, float b) //float

debug Color显示为,spring调用了//float 标识的构造方法,而不是期望的 //int
所以给参数加上类型参数 "type="java.lang.Integer",该解决了吧


<bean id="softBlue" class="java.awt.Color" >
<constructor-arg type="java.lang.Integer" index="0" ><value>0</value></constructor-arg>。。。

出现新错误 [b]问题2[/b]
...
.xml]: 3 constructor arguments specified but no matching constructor found in bean 'softBlue' (hint: specify index and/or type arguments for simple parameters to avoid type ambiguities)

大意是,请指定参数类型,避免类型混淆

////////////////////// 解决过程
问题1:google之,找到 [url=http://blog.codecentric.de/en/2009/02/jdk6-spring-20-adventure/]一个先行者囧[/url] ;里面说到jdk5和jdk6(win下)Color类文件里的两个构造方法(上面列举的//float,//int)位置不同,导致spring选择了//float代替了期望中的//int方法

那,问题2是怎么回事呢?指定类型为什么spring没认出来呢?

问题2:debug spring加载过程,到这一句,真相大白
	if (valueHolder.getType().equals(requiredType.getName())) {

valueHolder.getType()-->“java.lang.Integer”
requiredType.getName()-->"int"
不相同,导致spring autowire 失败。。。

由于我们用的还是spring1.2,所以怀疑spring2.0是否已经修复了

==========补充
spring2.0下也存在,看来指定primary类型需谨慎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值