2016-06-15 19 views
1

Spring 2.5を4.2にアップグレードしています。 問題は、プロパティタイプがorg.springframework.core.io.ClassPathResourceの1つのBeanにあります。リソース値はxmlでp:location="classpath:/<the resource path>"Spring 2.5から4.2へのアップグレードの問題 - BeanWrapperImpl

と定義されています。これは完全なBeanプロパティーにリソースが移入されています。しかし、4.2では値が設定されていません。

私はコードをデバッグし、クラスorg.springframework.beans.BeanWrapperImplが値を操作し、文字列をSpring 2.5の実際の値から削除していることがわかりました。

4.2でも同じことが当てはまりません。クラスorg.springframework.beans.BeanWrapperImplは、リソースを見つけることができない春の値を変更していません。

誰もが同様の状況に直面しましたか?どのような解決策を適用しましたか?

おかげで、 Hanumant

EDIT 1:サンプルコード

ばねconfigファイル

<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; 
} 

}

私は、Bean定義から classpath:を削除する場合

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定義xmlファイルにはclasspth:が必要ですか?なぜSpring 2.5で正常に動作していたのですか?

+0

スニペットではなくクラスに実際の設定を追加してください。 –

+0

@ M.Deinum、私は元の質問をコード – hanumant

+0

に変更しました。あなたのコードの初心者にとっては、特定のタイプではなく、 'Resource'でなければなりません。読み込めない場合は、その場所に存在しないためです(つまり、例外があなたに伝えているものです)。だから私は他の何かがあなたの構造で変わったと思います(そして、あなたは春だけではなく他のフレームワーク/ツールもアップグレードしているわけではないかもしれません)。 –

答えて

1

主な問題は、インターフェイスにプログラミングしていないことです。具体的にはorg.springframework.core.io.ClassPathResourceの代わりにorg.springframework.core.io.Resourceを使用してください。 org.springframework.core.io.ResourceEditorに行くと、StringResourceインスタンスに変換されます。 classpath:/<the resource path>を提供している場所はResourceLoaderに渡され、リソースを取得するか、存在しない場合はエラーをスローします。

具体的なタイプClassPathResouceを使用している場合、このメカニズムは直接作動せず、その場所はあなたが提供するものに設定されていますclasspath:/<the resource path>。しかし、これは実際にはURLクラスの有効な場所ではなく、最終的には表示されるメッセージで失敗します。

プレフィックスを削除するには、BeanWrapperImplのハック/回避策/パッチのために以前のバージョンで動作しました。

基本的には、まず最初にやってはいけないことがあったからです。

関連する問題