私は現在、ポートレットとサーブレットの両方としてアクセスされるアプリケーションに取り組んでいます (少なくとも一部はそうです)。また、プロトタイプ スコープで依存関係を 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