用于通过servlet和portlet-context在环境中注入依赖项的错误上下文

时间:2014-11-03 16:36:22

标签: spring-mvc servlets portlet spring-aop compile-time-weaving

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

0 个答案:

没有答案