发表于: 2017-12-18 22:44:33

1 576


一.今日完成

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,想想都惭愧.


四.收获

以上.



返回列表 返回列表
评论

    分享到