我目前正在开发一个应用程序,它既可以作为portlet访问,也可以作为servlet访问(至少某些部分是)。我还使用编译时编织将依赖关系注入到原型范围内的bean中,因此例如通过“new”或更常见地通过Hibernate创建的bean,如下所述:http://www.chrissearle.org/node/285 到目前为止,这工作正常,但我现在使用的服务器api必须在servlet和portlet中以不同方式调用。所以我在我的应用程序中创建了一个服务接口,并为接口创建了两个实现,一个用于servlet,一个用于portlet,因此每个实现都可以使用不同的server-api。每个实现仅在相应的servlet / portlet-application-context中配置。 如果首先使用servlet,则可以正常工作,注入并使用servlet的服务实现。但是,一旦使用了portlet,就只会为portlet和servlet注入和使用portlet的服务实现。
我原本希望servlet和portlet的容器是分开的。这是错误还是Spring不支持,还是有办法解决或解决这个问题?该应用程序仍在使用Spring 3.1.1,但当前版本4.1.1显示相同的行为。
我的配置看起来像这样(大规模简化):
界面:MyService:
public interface MyService {
public String getText();
}
Portlet的MyService-Implementation:
public class MyPortletService implements MyService {
@Override
public String getText() {
return this.getClass().toString();
}
}
Servlet的MyService-Implementation:
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-Controller:
logger.trace("new MyBean().getText(): " + new MyBean().getText());
servlet的应用程序-context.xml中:
<bean class="my.app.PortletController" />
<bean class="my.app.MyServletService"/>
portet-应用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