2

あまりにも長い間グーグルでこれに取り組んできました。さまざまなスタックオーバーフローの投稿も調べましたが、ここで何が起こっているのかまだわかりません。

まず、私が欲しいもの:

Web プロジェクトで依存関係として使用される持続性 jar があります。この永続化 jar 内で、daos は Web プロジェクトの spring 構成を使用して適切にセットアップされます。ただし、今やりたいことは、基本クラス (抽象) にあります。文字列にプロパティ セットを注入できるようにしたいのですが、この抽象クラスを拡張するクラスは、Spring を介して直接制御されません (たとえば、new を介してインスタンス化されます)。 MyImp().)

収集したすべてのものから、 @Configurableを使用して活用する必要があります。

奇妙なことに、コードはすべてコンパイルされます (アスペクトプラグインを使用する Maven を使用)。@Configurable 抽象クラスを拡張するオブジェクトへの呼び出しが「ブラックホール」に陥るように見えるため、いくつかのウィービングが行われている必要があると思います-まだエラーはありません古い skool System.out.print ステートメントを介してシステムに出力することさえできませんか??? 本当に奇妙です。

以下は、私がどのようにセットアップしたかに関する関連情報だと思います...(明らかにすべてを表示しているわけではありません):

Web プロジェクトの春の設定:

<util:properties id="props" location="classpath:application.properties"/>

<context:annotation-config />
<context:spring-configured/>
<context:component-scan base-package="com.foo" />

<bean class="com.foo.MyAbstractClass" abstract="true" scope="prototype">
    <property name="xlsDir" value="${xlsDir}"/>
</bean> 

//some DAOs are injected with datasources..not shown. Props being set just fine for the 
//datasources from application.properties, and the DAOs will work fine

上記の Web プロジェクト (MyAbstractClass とその子孫を保持する) で使用される jar には XML がありません。さまざまなファイルが MyAbstractClass を拡張し、new を介してアプリケーション内で作成されます。 MyImp imp = new MyImp(); imp.bar();

MyAbstractClass 関連情報:

@Configurable
public abstract class MyAbstractClass {
    private String xlsDir;

    public void setXlsDir(String xlsDir) {
        this.xlsDir = xlsDir;
     }  

    public void bar() {
        System.out.println("this won't even get printed, yet no errors!");
        System.out.println("xlsDir is "+xlsDir);
     }
 }

後で @Autowiring をいじったり、@Value を使ったりすることはできますが (とにかく最初に試したのはこれです)、今のところ、ウィービングが正しく機能しているかどうかさえわかりません。おそらく問題は、持続性 jar が最初に maven を介して (ウィービングを使用して) コンパイルされることですが、web プロジェクトに基づいて後で xlsDir のセッターが何であるかがわからないのでしょうか? しかし、なぜ bar() の呼び出しが消えてしまうのか、それは説明できません。何かが起こっているのです。

両方のプロジェクトで、Spring Roo の pom で見たものに基づいてコンパイルするように maven をセットアップしました (この pom に本当に必要なものをオンラインで特定するのは非常に困難で、maven の側面が spring で織り込まれています)。

関連する pom 情報は次のとおりです (Spring Roo のコメントを以下に残しました - それらは私のものではありません)。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.2</version> <!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 -->
    <dependencies>
        <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see 
            MNG-2972) -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outxml>true</outxml>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspectj.version}</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectj.version}</version>
</dependency> 
 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${spring.version}</version>
</dependency> 
 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>

どんな助けでも大歓迎です。私はすぐにあきらめようとしており、プロパティファイルを静的ブロックにロードして、それで完了です:)

4

1 に答える 1

0

豆の定義

<bean class="com.foo.MyAbstractClass" abstract="true" scope="prototype">
    <property name="xlsDir" value="${xlsDir}"/>
</bean> 

他の Bean 定義で親として使用されていない場合は何もしません。@Configurable Bean を自動配線する場合は、 @Configurable(autowire=Autowire.BY_NAME) を使用し、name="xlsDir" で String Bean を宣言します。

<bean id="xlsDir" class="java.lang.String" factory-method="valueOf">
    <constructor-arg value="${xlsDir}"/>
 </bean>
于 2012-02-17T01:52:21.470 に答える