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 去除了前缀,它在早期版本中有效。
基本上它现在失败了,因为你在哪里做了你一开始就不应该做的事情。
我正在将 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 去除了前缀,它在早期版本中有效。
基本上它现在失败了,因为你在哪里做了你一开始就不应该做的事情。