从Spring控制器获取ATG会话范围核心

时间:2014-09-16 19:44:01

标签: java oracle spring-mvc atg atg-dynamo

我一直在努力在Spring控制器中看到ATG配置文件。

刚开始的时候,我认为通过这样定义,可以通过阅读this document从弹簧控制器获取atg配置文件。

<bean name="/Profile" class="atg.nucleus.spring.NucleusResolverUtil"
    factory-method="resolveName" singleton="false">
  <constructor-arg value="/atg/userprofiling/Profile"/>
</bean>

但是,我看了另一个问题documentation,并发现如果不通过atg DAF流水线操作,会话范围内的/atg/userprofiling/Profile之类的neclues就不可用。

  

注意:当您将自己的servlet添加到servlet管道时,请耐心等待   请注意,在此之前您无法访问会话对象   SessionServlet定位或创建它。所以,如果你添加一个servlet   需要访问会话对象的管道,确保你的   servlet出现在SessionServlet之后的管道中。

因此,我试图为弹簧servlet设置PageFilter,如下所示。

<!--  ATG Services -->
<!--  any request starting with /services must be through ATG DAF pipe lining  -->
<filter-mapping>
    <filter-name>PageFilter</filter-name>
    <url-pattern>/services/*</url-pattern>
</filter-mapping>

<!--  The following can be annotated, but we need to upgrade to servlet 3 -->
<servlet>
   <servlet-name>HelloService</servlet-name>
   <servlet-class>com.my.services.HelloService</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>HelloService</servlet-name>
   <url-pattern>/services/hello</url-pattern>
</servlet-mapping>    

然而,它失败了。原因是spring Controller不是Servlet,所以它不能在ATG daf pipelininng的末尾。

如果我使用简单的HttpServletDynamoServlet,我可以访问用户个人资料。

但是,我真的需要使用Spring Framework,因为我的公司想要使用它。 另一个原因是我们在servlet2.3,我真的想使用Spring注释。

问题是;

  1. 有没有办法从Spring控制器获取atg会话范围的necleus而不通过DAF管道传输?

  2. 像JSP页面一样,有没有办法在ATG daf流水线结束时设置弹簧控制器?

2 个答案:

答案 0 :(得分:0)

在这里,我发布了我找到的解决方案

  1. 有没有办法从Spring控制器获取atg会话范围的necleus而不通过DAF管道传输?

    NO。我们需要通过ATG DAF流水线来获得会话范围的核心。

  2. 像JSP页面一样,有没有办法在ATG daf流水线结束时设置弹簧控制器?

    是的!!!,除了现有的PageFilter Mapping之外,我们可以让Spring DispatcherServlet在ATG DAF管道的末尾而不是直接的servlet映射。

  3. 以下是我的web.xml

    .... 
    
    <filter>
        <filter-name>PageFilter</filter-name>
        <filter-class>atg.filter.dspjsp.PageFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>PageFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    
    <filter-mapping>
        <filter-name>PageFilter</filter-name>
        <url-pattern>/spring/*</url-pattern>
    </filter-mapping>
    
    ....
    
    <!-- Use spring DispatcherServlet with annotations i.e @Controller, etc -->
    <servlet>
       <servlet-name>spring</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
       <servlet-name>spring</servlet-name>
       <url-pattern>/spring/*</url-pattern>
    </servlet-mapping>
    

    这可能不是理想的答案,但至少可行。

答案 1 :(得分:0)

在应用程序范围的ApplicationContext中使用工厂方法并不总是按预期工作。

您是否考虑过使用Delivery Cube Common Component Resolver类?

https://github.com/deliverycube/deliverycube-common