1

我目前正在开发一个应用程序,它既可以作为 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

4

0 回答 0