1

私のアプリケーションは、FrameworkBase (JAR)、FrameworkBaseImpl (JAR)、FrameworkRestService (WAR) の 3 つの Maven プロジェクト (他のモジュールは省略しています) で構成されています。

FrameworkRestService は FrameworkBaseImpl へのプラグインであり、FrameworkBaseImpl が実装/拡張する FrameworkBase からそのクラス/インターフェイス定義を描画します。(Maven の循環的な依存関係を避けるために、FrameworkBase を分割する必要がありました)。

FrameworkBaseImpl には、Jetty を呼び出して FrameworkRestService war を渡す main があります。

FrameworkBaseImpl の FrameworkMain クラスの (唯一の) インスタンスに、Spring に RestService インスタンスをフィールド メンバーとして挿入させようとしています。私のSpringは、FrameworkRestServiceプロジェクト内のFrameworkRestServiceクラスをrestService Beanの実装として指しています。

ここに問題があります。Spring は、Bean を含むインポートされた Framework_rest_service.context ファイルを WAR で見つけたように見えますが、注入に失敗します (restService という名前の Bean が見つかりません)。しかし、FrameworkRestService を JAR に変換すると、魔法のように成功します。私はそれに2日間立ち往生しています!助けてください!

FrameworkBase pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>framework.base</artifactId>
  <packaging>jar</packaging>
  <name>framework.base</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <parent>
    <groupId>controlapps</groupId>
    <artifactId>controlapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../controlapp/pom.xml</relativePath>
  </parent>
</project>

FrameworkBase レストサービス:

package com.company.controlapps.framework.base;

public class RestService {
    public FrameworkMain frameworkMain;

    /* Setters for Spring */
    public void setFrameworkMain(FrameworkMain frameworkMain) 
            {this.frameworkMain = frameworkMain;}
}

FrameworkBase FrameworkMain:

package com.company.controlapps.framework.base;

public interface FrameworkMain {    
...
}

FrameworkBaseImpl pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>framework.base.impl</artifactId>
  <packaging>jar</packaging>
  <name>framework.base.impl</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <parent>
    <groupId>controlapps</groupId>
     <artifactId>controlapp</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <relativePath>../controlapp/pom.xml</relativePath>
  </parent>

  <dependencies>
      <dependency>
    <groupId>controlapps</groupId>
    <artifactId>framework.base</artifactId>
     <version>0.0.1-SNAPSHOT</version>
  </dependency>
  <dependency>
     <groupId>controlapps</groupId>
     <artifactId>framework.restservice</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <scope>runtime</scope>
     <type>war</type>       
   </dependency>
  </dependencies>
</project>

FrameworkBaseImpl FrameworkMainImpl:

package com.company.controlapps.framework.base.impl;

public class FrameworkMainImpl implements FrameworkMain {
    ....
    protected RestService restService;
    public void setRestService(RestService restService) 
        {this.restService = restService;}
}

public static void main(String[] args) {        
    context = new ClassPathXmlApplicationContext(SPRING_CONTEXT_FILENAME);
    FrameworkMainImpl frameworkMain = (FrameworkMainImpl) context.getBean("frameworkMain");
        ...
}

FrameworkBaseImpl スプリング context.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <import resource="classpath*:framework_restservice_context.xml"/>

    <bean id="frameworkMain" class="com.company.controlapps.framework.base.impl.FrameworkMainImpl" >
    <property name="restService" ref="restService" />
    </bean> 
</beans>

FrameworkRestService FrameworkRestService pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>framework.restservice</artifactId>
  <packaging>war</packaging>
  <name>framework.restservice</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jersey.version>1.12</jersey.version>
  </properties>

  <parent>
    <groupId>controlapps</groupId>
    <artifactId>controlapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../controlapp/pom.xml</relativePath>
  </parent>

  <dependencies>
      <dependency>
      <groupId>controlapps</groupId>
      <artifactId>framework.base</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      </dependency>
      <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-server</artifactId>
      <version>${jersey.version}</version>
      </dependency>
      <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-json</artifactId>
      <version>${jersey.version}</version>
      </dependency>
      <dependency>
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-server-linking</artifactId>
       <version>${jersey.version}</version>
      </dependency>
      <dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-spring</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.5.4</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
  </dependencies>
</project>

FrameworkRestService 春の Framework_restservice_context.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="restService" class="com.radware.controlapps.framework.restservice.FrameworkRestService">
    <property name="frameworkMain" ref="frameworkMain" />
   </bean>
</beans>

FrameworkRestService FrameworkRestService.java スニペット:

package com.company.controlapps.framework.restservice;

@Path("myresource")
public class FrameworkRestService extends RestService {
    ... 
    @Context
    UriInfo uriInfo;
    @Context
    Request request;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public MyResource getMyResource() {
    ...
    frameworkMain.doSomething();
    ....
}

長い質問で申し訳ありません。:-)

4

1 に答える 1

0

クラスローダーの問題ではありませんでした。WAR と JAR で (JAR の) 同じクラス ローダーを使用しました。誰かが、WAR をリンクしてそこにある Bean を探すべきではなかったとコメントしました。

そのため、問題を解決しようとする代わりに、JAR と WAR の間の Spring 依存関係をキャンセルすることで問題を回避しました。WAR では、JAR でインスタンス化された FrameworkMain シングルトンへの参照が必要でした。

私はこれを次のように「ハッキング」しました: public static メソッド get および FrameworkMain インスタンス シングルトンを設定する、Holder という名前のクラスを追加しました。WAR から get を呼び出し、jar から set を呼び出します。これを FrameworkMain に追加できませんでした。これは、実際には FrameworkBase jar のインターフェイスです (FrameworkBaseImpl jar の FrameworkMainImpl によって実装されています)。

ありがとう。

于 2013-03-21T12:12:36.710 に答える