我目前正在开发一个应用程序,它既可以作为 portlet 也可以作为 servlet 访问(至少某些部分是)。我还使用 compile-time-weaving 将依赖项注入到原型范围内的 bean 中,例如通过“new”或更常见的通过 Hibernate 创建的 bean,如下所述:http: //www.chrissearle.org/节点/285 到目前为止,这工作正常,但是我现在使用的服务器 API 必须在 servlet 和 portlet 中以不同方式调用。所以我在我的应用程序中为服务创建了一个接口,并为该接口创建了两个实现,一个用于 servlet,一个用于 portlet,因此每个都可以不同地使用 server-api。每个实现仅在对应的 servlet/portlet-application-context 中配置。如果首先使用 servlet,则可以正常工作,注入并使用 servlet 的服务实现。然而,一旦使用了 portlet,只有 portlet 的服务实现将被注入和使用,用于 portlet 和 servlet。
我本来希望 servlet 和 portlet 的容器是分开的。这是一个错误还是 Spring 不支持,或者有没有办法修复或解决这个问题?该应用程序仍在使用 Spring 3.1.1,但当前版本 4.1.1 显示相同的行为。
我的配置看起来像这样(大大简化):
接口:我的服务:
public interface MyService {
public String getText();
}
Portlet 的 MyService 实现:
public class MyPortletService implements MyService {
@Override
public String getText() {
return this.getClass().toString();
}
}
Servlet 的 MyService 实现:
public class MyServletService implements MyService {
@Override
public String getText() {
return this.getClass().toString();
}
}
Servlet 和 Portlet 使用的 Bean:
@Configurable
public class MyBean {
@Autowired
private MyService myService;
public String getText() {
return myService.getText();
}
}
调用 Portlet 和 Servlet 控制器:
logger.trace("new MyBean().getText(): " + new MyBean().getText());
servlet-应用程序-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>
如果按顺序调用 servlet、portlet、servlet,则记录输出:
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