spring与java谁之过?

一项目之前正常运行,今天测试又跑了一下,发现启动不了啊。还是环境maven打包问题,后来把新打的包解析和之前比较发现类库完全一样。
关键异常信息如下:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memcachedClient': FactoryBean threw exception on object creation; nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:127)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:91)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1285)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:217)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByName(AbstractAutowireCapableBeanFactory.java:1029)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:977)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
... 27 more
百思不得姐啊,费劲周折把tomcat从6换到8均跑不起来。
后来不得已把包扔给同事,同事的小猫居然也可以启动。
后来突然想起我最近把JAVA_HOME改换成了Java8了,于是把Java切换成原来的Java6,终于跑起来了。
今天闲来无事,想探下究竟,发现报错代码如下

private int[] getWeightsArray(
            Map<InetSocketAddress, InetSocketAddress> serverMap) {
        int[] weightsArray = null;
        if (serverMap != null && serverMap.size() > 0 && this.weights != null) {
            if (this.weights.size() < serverMap.size()) {
                throw new IllegalArgumentException(
                        "Weight list's size is less than server list's size");
            }
            weightsArray = new int[this.weights.size()];
            for (int i = 0; i < weightsArray.length; i++) {
                weightsArray[i] = this.weights.get(i);
            }
        }
        return weightsArray;
    }

spring 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
    <bean name="memcachedClient"
        class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
        <property name="servers">
            <value>${cache.memcached.servers}</value>
        </property>
        <property name="weights">
            <list>
                <value>1</value>
            </list>
        </property>
        <property name="sessionLocator">
            <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
        </property>
        <property name="transcoder">
            <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
        </property>
        <property name="bufferAllocator">
            <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean>
        </property>
    </bean>
</beans> 

spring 版本为
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
            <version>2.5.5</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>

   我尝试spring配置改为如下
  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
    <bean name="memcachedClient"
        class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
        <property name="servers">
            <value>${cache.memcached.servers}</value>
        </property>
        <property name="weights">
            <list>
                <value type="java.lang.Integer">1</value>
            </list>
        </property>
        <property name="sessionLocator">
            <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
        </property>
        <property name="transcoder">
            <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
        </property>
        <property name="bufferAllocator">
            <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean>
        </property>
    </bean>
</beans> 
  Java环境换成8  居然不报错了,太神奇了。

不过最终是何原因呢? 待继续研究spring List注入源码,Java泛型机制也许方可知道。

你可能感兴趣的:(java,spring,tomcat)