1

私は現在、ポートレットとサーブレットの両方としてアクセスされるアプリケーションに取り組んでいます (少なくとも一部はそうです)。また、プロトタイプ スコープで依存関係を Bean に注入するためにコンパイル時ウィービングを使用しています。たとえば、ここで説明されているように、「新規」またはより一般的には Hibernate を介して作成された Bean です: http://www.chrissearle.org/ノード/285 これは今のところ正常に動作していますが、サーブレットとポートレットで異なる方法で呼び出す必要があるサーバー API を使用しています。そこで、アプリケーション内のサービス用のインターフェースを作成し、そのインターフェースに対して 2 つの実装 (1 つはサーブレット用、もう 1 つはポートレット用) を作成して、それぞれがサーバー API を異なる方法で使用できるようにしました。各実装は、対応するサーブレット/ポートレット アプリケーション コンテキストでのみ構成されます。サーブレットが最初に使用される場合、これは正常に機能し、サーブレットのサービス実装が注入されて使用されます。ただし、ポートレットが使用されると、ポートレットとサーブレットの両方に対して、ポートレットのサービス実装のみが注入されて使用されます。

サーブレットとポートレットのコンテナは別のものだと思っていました。これはエラーですか、Spring でサポートされていませんか、またはこれを修正または回避する方法はありますか? アプリケーションはまだ Spring 3.1.1 を使用していますが、現在のバージョン 4.1.1 は同じ動作を示しています。

私の設定は次のようになります(大幅に簡略化されています):

インターフェース: MyService:

public interface MyService {
    public String getText();
}

MyService-ポートレットの実装:

public class MyPortletService implements MyService {
    @Override
    public String getText() {
        return this.getClass().toString();
    }
}

MyService-サーブレットの実装:

public class MyServletService implements MyService {
    @Override
    public String getText() {
        return this.getClass().toString();
    }
}

サーブレットとポートレットで使用する Bean:

@Configurable
public class MyBean {
    @Autowired
    private MyService myService;
    public String getText() {
        return myService.getText();
    }
}

Portlet-Controller と Servlet-Controller を呼び出します。

logger.trace("new MyBean().getText(): " + new MyBean().getText());

サーブレット-アプリケーション-context.xml:

<bean class="my.app.PortletController" />
<bean class="my.app.MyServletService"/>

portet-application-context.xml:

<bean class="my.app.ServletController" />
<bean class="my.app.MyPortletService"/>

関連する pom.xml の依存関係

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.7.4</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency> -->

コンパイル時ウィービング構成:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.6</version>
    <configuration>
        <complianceLevel>1.6</complianceLevel>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

サーブレット、ポートレット、サーブレットをこの順序で呼び出した場合のログ出力:

new MyBean().getText(): class my.app.MyServletService
new MyBean().getText(): class my.app.MyPortletService
new MyBean().getText(): class my.app.MyPortletService

2014 年 11 月 27 日更新: 問題の概要を示すテスト ケースを作成しました。

https://github.com/ChrZae/servlet-portlet-spring-container-issue

4

0 に答える 0