Spring 2.5 到 4.2 升级问题 - BeanWrapperImpl

Spring 2.5 to 4.2 upgrade issue - BeanWrapperImpl

我正在将 Spring 2.5 升级到 4.2。 问题出在一个 属性 类型 org.springframework.core.io.ClassPathResource 的 bean 上。资源值在xml中定义为p:location="classpath:/<the resource path>"

这非常有效,bean 属性 中填充了资源。但在 4.2 中,该值未设置。

所以我调试了代码,发现 class org.springframework.beans.BeanWrapperImpl 正在操纵值并从 Spring 2.5.[=22 中的实际值中删除 classpath: 字符串=]

但是在 4.2 中情况并非如此,class org.springframework.beans.BeanWrapperImpl 没有修改导致 spring 找不到资源的值。

有人遇到过类似情况吗?您应用了什么解决方案?

谢谢, 哈努曼特

编辑 1:代码示例

spring 配置文件

    <bean class="com.test.sample.TestBean" id="testBean"
p:schemaLocation="classpath:/com/test/sample/Excalibur_combined.xsd" />

TestBean.java

public class TestBean {
private ClassPathResource             schemaLocation;

public ClassPathResource getSchemaLocation() {
    return schemaLocation;
}

public void setSchemaLocation(ClassPathResource schemaLocation) {
    this.schemaLocation = schemaLocation;
}

}

App.java

public class App {
public static void main(String[] args) {

    ApplicationContext ap = new ClassPathXmlApplicationContext("classpath:/com/test/sample/spring-config.xml");
    TestBean tb = (TestBean) ap.getBean("testBean");
    try {
        URL url = tb.getSchemaLocation().getURL();
        System.out.println(url);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

错误信息

INFO: Loading XML bean definitions from class path resource
[com/test/sample/spring-config.xml] java.io.FileNotFoundException:
class path resource
[classpath:/com/test/sample/Excalibur_combined.xsd] cannot be resolved
to URL because it does not exist    at
org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:187)>       at com.test.sample.App.main(App.java:20)

但是,如果我从 bean 定义中删除 classpath: 它会起作用。

bean 定义 xml 文件中是否需要 classpth:?为什么它在 Spring 2.5 中运行良好??

主要问题是您没有针对接口进行编程。使用 org.springframework.core.io.Resource 而不是具体的 org.springframework.core.io.ClassPathResource。当对 org.springframework.core.io.ResourceEditor 执行操作时,将启动并将 String 转换为 Resource 实例。您提供的位置 classpath:/<the resource path> 将传递给 ResourceLoader ,后者将获取资源或在资源不存在时抛出错误。

但是,如果您直接使用具体类型 ClassPathResouce,则此机制不会启动,位置将设置为您提供的内容 classpath:/<the resource path>。但是,这实际上不是 URL class 的有效位置,最终会失败并显示您看到的消息。

由于 BeanWrapperImpl 中的 hack/workaround/patch 去除了前缀,它在早期版本中有效。

基本上它现在失败了,因为你在哪里做了你一开始就不应该做的事情。