2016-06-15 198 views
1

我將Spring 2.5升級到4.2。 問題出在一個屬性類型爲org.springframework.core.io.ClassPathResource的bean上。資源值在xml中定義爲p:location="classpath:/<the resource path>"春季2.5到4.2升級問題 - BeanWrapperImpl

這工作完美,bean屬性已填充資源。但在4.2中,這個價值沒有被設定。

所以我調試了代碼,發現類org.springframework.beans.BeanWrapperImpl正在操縱該值並從Spring 2.5中刪除實際值的classpath:字符串。

但是4.2中的情況並非如此,並且org.springframework.beans.BeanWrapperImpl類沒有修改導致spring未找到資源的值。

任何人都面臨類似的情況?你應用了什麼解決方案?

謝謝, Hanumant

EDIT 1:代碼示例

彈簧配置文件

<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:

那麼classpth:是否需要在bean定義的xml文件中?爲什麼它在Spring 2.5中工作正常?

+0

請將實際配置添加到您的班級,而不是片段。 –

+0

@ M.Deinum,我修改了原始問題,代碼爲 – hanumant

+0

對於初學者來說,它應該是一個'Resource'而不是特定的類型。如果它不能被加載,那是因爲它不存在於那個位置(這是異常告訴你的)。所以我猜想其他結構也會發生變化(也許你不僅僅是升級spring,還有其他框架/工具)。 –

回答

1

主要問題是您沒有編程接口。而不是具體的org.springframework.core.io.ClassPathResource使用org.springframework.core.io.Resource。當做到org.springframework.core.io.ResourceEditor將踢入並將String轉換爲Resource實例。您提供的位置classpath:/<the resource path>將傳遞給ResourceLoader,該位置將獲取資源或發生錯誤(如果不存在)。

但是,如果您直接使用具體類型ClassPathResouce,則此機制不會啓動並且位置設置爲您提供的內容classpath:/<the resource path>。但是,實際上這不是URL類的有效位置,並且最終會因您看到的消息而失敗。

由於BeanWrapperImpl中的黑客/解決方法/修補程序剝去了前綴,它在早期版本中起作用。

基本上,它現在失敗了,因爲你在哪裏做事情你不應該做的第一個地方。