发表于: 2017-12-18 22:44:33
1 577
一.今日完成
1.今天继续写文学部前台接口,遇到一个关于bean的变量命名问题
Spring配置文件中<property>元素所指定的属性名和Bean实现类的Setter方法满足
Sun JavaBean的属性命名规范:xxx的属性对应setXxx()方法。
一般情况下,Java的属性变量名都以小写字母开头,如maxSpeed、brand等,但也存在特殊的情况。考虑到一些特定意义的大写英文缩略词(如USA、XML等),JavaBean也允许以大写字母开头的属性变量名,不过必须满足"变量的前两个字母要么全部大写,要么全部小写"的要求,如brand、IDCode、IC、ICCard等属性变量名是合法的,而iC,iCcard、iDCode等属性变量名则是非法的。
这是一个隐晦的问题,下面是一个"违反"了JavaBean属性命名规范的类
public class Foo{
//非法的属性变量名.Java本身不会报错,因为它将iDCode看作普通变量
private Strng iDCode;
//该Setter方法对应IDCode属性而非iDCode属性
public void setIDCode(String iDcod){
this. IDCode=iDcode;
}
}
在Spring配置文件中,可能会想当然地为Foo提供以下配置
<bean id= "foo" class="com.smart.attr.Foo">
<!--下面这个属性变量是非法的-->
<property name="iDCode" value="070101"/ >
</bean>
当我们试图启动Spring容器时,将得到启动失败的结果,控制台输出以下错误
信息
Error setting property valuesi nested exception is org. spririgframework.bean. NOtwritablePropertyExcption: Invalid property "iDcode' of bean class.....
虽然Spring给出了启动失败的原因,但错误信息具有很强的误导性,因为它°报怨。Foo中没有提供对应于iDCode的Setter方法,但事实上Foo已经提供了setIDCode()方法。那真相到底是什么呢?其实真正的错误根源是我们在Sprin配置文件中指定了一个非法的属性名iDcode,这个非法的属性名永远不可能有对应的Setter方法,因此错误就产生了。
纠正的办法是将配置文件中的属性名改为IDCode,如下:
<bean id="foo" classa="com.smart.attr.Foo">
<property name="IDCode" value="07010/>
</beah>
Foo类中的iDCode属性变量名不一定要修改,因为Spring配置文件的属性名仅对应于Bean实现类的get/setXxx()方法。但是如果进一步探讨引发这个配置错误的根源,就会归咎于Foo类中iDCade的变量名。原因很简单,因为我们在编写了Foo的iDCode变量名后,通过IDE的代码自完成功能生成setIDCode()属性设置方法,
然后想当然地在Spring配置文件中使用iDCode属性名进行配置,最终造成了Spnng
器的启动错误.
2.处理Spring Template增删查改方法单元测试中,不能成功注入Bean的问题
public class StudentJDBCTemplateTest{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentJDBCTemplate stuJdbcTem = (StudentJDBCTemplate) ctx.getBean("stuJdbcTem",StudentJDBCTemplate.class);
@Test
public void insertStudent() {
Student stu = new Student();
stu.setName("杜甫");
stu.setQq("1234567");
stu.setType("java");
stu.setEnrolment("十二月");
int i = stuJdbcTem.insertStudent(stu);
if(i==1){
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
}
运行报错:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'stuJdbcTem' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207)
........
尝试启动业务层Spring容器,通过反射来加载Bean,一直未成功,因为时间有点晚,计划明天上午再看看.
二.明日计划
前台接口又拖了一天,明天怎么都得搞完.
三.遇到问题
除了使用注解方式外不会启动加载Spring IoC,想想都惭愧.
四.收获
以上.
评论