web-dev-qa-db-ja.com

JavaからSpringアプリケーションを開始する際の例外

Mavenを使用してSpringプロジェクトをコンパイルして開始できます。

mvn -e clean compile exec:Java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test

ただし、maven-Assembly-pluginapplicationContext.xmlを含む)を使用してすべてのjarファイルを1つのファイルにアセンブルすると、Exceptionの実行中に常にJavaを取得します。

Java -cp target/test-jar-with-dependencies.jar:. de.fraunhofer.fkie.tet.vmware.manager.Test

  INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
  Sep 6, 2010 10:37:21 AM org.springframework.util.xml.SimpleSaxErrorHandler warning
  WARNING: Ignored XML validation warning
  org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/context/spring-context.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
  ...
  Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 
  Line 10 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 
  The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.
  ...
  Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 
  The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.

また、スキーマ定義、つまりspring-context.xsdなどを直接クラスパスに添付しようとしましたが、成功しませんでした。

less src/main/resources/applicationContext.xml

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:context="http://www.springframework.org/schema/context"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans.xsd
                             http://www.springframework.org/schema/context 
                             http://www.springframework.org/schema/context/spring-context.xsd">

      <context:annotation-config />   <!-- wegen '@PostConstruct' -->
  <!--<context:component-scan base-package="de.fraunhofer" />     -->
  ...
  </beans>
15
rmv

Spring名前空間ハンドラーは、ファイル/META-INF/spring.schemasおよび/META-INF/spring.handlersを使用して解決されます。これらの名前のファイルは異なるSpring jarに存在するため、maven-Assembly-pluginの後にターゲットjarに残るのはおそらく1つだけです。

おそらく、これらのファイルを手動でマージし、何らかの方法でmaven-Assembly-pluginを構成して、ターゲットjar内のファイルをこのマージされたファイルで上書きすることができます。

19
axtavt

Spring構成ファイルにcontext XML名前空間がないと思われます。次のように、Spring構成ファイルのルート要素に追加する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.abc.xyz" />

</beans>
5
Abhinav Sarkar

私はaxtavtの返答に従ってこれの根本的な問題を見つけ、それをバグとして報告しましたか? Spring: https://jira.springsource.org/browse/SPR-8368 -これらのファイルの独自のマージされたコピーを生成するための回避策がそこに含まれています。後世のために、コードもここにあります:

//IOUtils and FileUtils come from Apache Commons IO
for(String s : new String[] {"spring.schemas", "spring.handlers", "spring.tooling"}) {
    Enumeration<?> e = Test.class.getClassLoader().getResources("META-INF/"+s);
    StringBuilder out = new StringBuilder();
    while(e.hasMoreElements()) {
        URL u = (URL) e.nextElement();
        out.append(IOUtils.toString(u.openStream())).append("\n");
    }
    File outf = new File(s);
    FileUtils.writeStringToFile(outf, out.toString(), "UTF-8");
}
3
Ian

この問題には3つの解決策があると思います

  1. Tx jarファイルは、プロジェクトのクラスパス/ビルドパスに含まれている必要があります。 (最も一般的なエラー)
  2. 上記の「axtavt」で言及
  3. 「axtaxt」ソリューションの前にこれを試してください:warディレクトリ(GWTコンパイルの詳細タブで指定)に移動し、warディレクトリの下のlibフォルダーにspring-tx.jarファイルを置き、更新して再度実行します。
1
lokesh

春にはどのような依存関係がありますか?一部のSpring jarファイルがクラスパス上にないため、xml解析エラーが発生する場合があります。春3に、ライブラリは多くのjarファイルに分割されました。チェックアウト この投稿 必要なものを確認するには、具体的には:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
0
krock

それが示唆するように、リクエストまたはレスポンスのいずれかの解析に問題があります。このエラーは、RestTemplateクライアントがリソースからの特定の種類の応答を期待しているが、リソースが何かを完全に返している場合に発生する可能性があります。返された応答の変更に関連するPOST RestTemplateクライアントでこのエラーが発生しました。

たとえばエンティティ 'MyClass'を返していた最初のRestTemplateが変更され、文字列を返すようになりましたので、パーサーはエラーを出し始めました。

 ResponseEntity<MyClass> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, MyClass.class);
 MyClass postResponseBody = postResponseEntity.getBody();

に変更

 ResponseEntity<String> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, String.class);
 String postResponseBody = postResponseEntity.getBody();

応答タイプがエンティティから文字列に変更されたため、パーサーは応答の処理中にエラーを出し始めました。それを正しい応答タイプ(私の場合は文字列)に変更し、機能し始めました。

0
Vivek Kumar