java - OSGi bundle - 获取 DataSourcePool 以在 Adob​​e CQ5 中的 servlet 中使用

标签 java osgi datasource aem

我正在尝试获取 Adob​​e CQ5 bundle 中 OSGi 中 servlet 的 DataSourcePool 实例,但标准方法不起作用。我曾经像这样通过 Activator 获取 DataSourcePool

public class Activator implements BundleActivator {
    private DataSourcePool source;

    public void start(BundleContext context) throws Exception {
        ServiceReference dspRef = context.getServiceReference(DataSourcePool.class.getName());
        source = (DataSourcePool)context.getService(dspRef);
    }

    public static DataSourcePool getDataSourcePool(){
        return source;
    }
}

但是自从我开始在 Eclipse 中开发后,这不再起作用了。我在 Eclipse 中有这个项目结构

project-default
project-default-bundle
\src
   \main
       \java
          \cz
             \package
                \sub1
                \sub2
                \Activator.java
           \other
              \package
                 \servlets
                    \MyServlet.java

project-default-components
project-default-content

当我尝试获取MyServlet.java中的DataSourcePool时,cz.package.Activator.getDataSourcePool()的返回值;一片空白。我也尝试使用 @Reference,但在编译和运行 servlet 后它只是给了我 HTTP 403 Forbidden 错误。

感谢您的帮助

编辑

这就是我的 servlet 的样子

package my.pckg.servlets;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.ServletException;
import javax.sql.DataSource;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.commons.datasource.poolservice.DataSourcePool;

@Component(immediate = true)
@Service(value=javax.servlet.Servlet.class)
@Properties(value={
        @Property(name="sling.servlet.methods", value={"GET"}),
        @Property(name="sling.servlet.paths", value={"/myservices/saveandinvite"})
})
public class SaveAndInvitePeople extends SlingAllMethodsServlet{

    private static final long serialVersionUID = 7923689671005539630L;
    private static final Logger log = LoggerFactory.getLogger(SaveAndInvitePeople.class);

    @Reference
    private DataSourcePool source;
    //private DataSourcePool dataSourcePool = null;

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException{
        log.info("doGet");
        /*this.dataSourcePool = Activator.getDataSourcePool();
        if(this.dataSourcePool == null){
            log.info("datasourcepool == null!");
        }*/
        if(this.source == null){
            log.info("datasourcepool == null!");
        }
        try{
            //DataSource ds = (DataSource)this.dataSourcePool.getDataSource("myConnection");
            DataSource ds = (DataSource)this.source.getDataSource("myConnection");
            if(ds == null){
                log.error("DataSource is null!");
                return;
            }
            log.info("datasource not null! gonna try to get connection!");
            Connection con = null;
            try{
                con = ds.getConnection();
            }catch(Exception e){
                log.error("Exception "+e.getClass().getName()+": "+e.getMessage());
            }finally{
                if(con != null){
                    try{
                        con.close();
                    }catch(Exception e){
                        log.error("Exception "+e.getClass().getName()+": "+e.getMessage());
                    }
                }
            }
            log.info("looks OK!");
        }catch(Exception e){
            log.error("Exception "+e.getClass().getName()+": "+e.getMessage());
        }
    }

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException{

    }
}

这是我收到的 HTTP 403 Forbidden 消息。

Forbidden

Cannot serve request to /myservice/saveandinvite/ in org.apache.sling.servlets.get.DefaultGetServlet

Request Progress:

      0 (2014-01-29 11:51:40) TIMER_START{Request Processing}
      0 (2014-01-29 11:51:40) COMMENT timer_end format is {<elapsed msec>,<timer name>} <optional message>
      0 (2014-01-29 11:51:40) LOG Method=GET, PathInfo=/myservice/saveandinvite/
      0 (2014-01-29 11:51:40) TIMER_START{ResourceResolution}
      0 (2014-01-29 11:51:40) TIMER_END{0,ResourceResolution} URI=/myservice/saveandinvite/ resolves to Resource=, type=sling:syntheticResourceProviderResource, path=/myservice/saveandinvite, resource=[SyntheticResource, type=sling:syntheticResourceProviderResource, path=/myservice/saveandinvite]
      0 (2014-01-29 11:51:40) LOG Resource Path Info: SlingRequestPathInfo: path='/myservice/saveandinvite', selectorString='null', extension='null', suffix='/'
      0 (2014-01-29 11:51:40) TIMER_START{ServletResolution}
      0 (2014-01-29 11:51:40) TIMER_START{resolveServlet(, type=sling:syntheticResourceProviderResource, path=/myservice/saveandinvite, resource=[SyntheticResource, type=sling:syntheticResourceProviderResource, path=/myservice/saveandinvite])}
      2 (2014-01-29 11:51:40) TIMER_END{2,resolveServlet(, type=sling:syntheticResourceProviderResource, path=/myservice/saveandinvite, resource=[SyntheticResource, type=sling:syntheticResourceProviderResource, path=/myservice/saveandinvite])} Using servlet org.apache.sling.servlets.get.DefaultGetServlet
      2 (2014-01-29 11:51:40) TIMER_END{2,ServletResolution} URI=/myservice/saveandinvite/ handled by Servlet=org.apache.sling.servlets.get.DefaultGetServlet
      2 (2014-01-29 11:51:40) LOG Applying Requestfilters
      2 (2014-01-29 11:51:40) LOG Calling filter: org.apache.sling.bgservlets.impl.BackgroundServletStarterFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: org.apache.sling.i18n.impl.I18NFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: org.apache.sling.rewriter.impl.RewriterFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.designimporter.CanvasPageDeleteRequestFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.core.impl.WCMRequestFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: cz.devsoft.hartmann.project20130901v01.impl.filters.LoggingFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.adobe.granite.optout.impl.OptOutFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.theme.impl.ThemeResolverFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet
      2 (2014-01-29 11:51:40) LOG Calling filter: org.apache.sling.engine.impl.debug.RequestProgressTrackerLogFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.mobile.core.impl.redirect.RedirectFilter
      2 (2014-01-29 11:51:40) LOG RedirectFilter did not redirect (request extension does not match)
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.core.impl.warp.TimeWarpFilter
      2 (2014-01-29 11:51:40) LOG Applying Componentfilters
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.core.impl.WCMComponentFilter
      2 (2014-01-29 11:51:40) LOG Calling filter: com.day.cq.wcm.core.impl.WCMDebugFilter
      2 (2014-01-29 11:51:40) TIMER_START{org.apache.sling.servlets.get.DefaultGetServlet#0}
      2 (2014-01-29 11:51:40) LOG Using org.apache.sling.servlets.get.impl.helpers.StreamRendererServlet to render for extension=null
      2 (2014-01-29 11:51:40) LOG Applying Error filters
      2 (2014-01-29 11:51:40) LOG Calling filter: org.apache.sling.rewriter.impl.RewriterFilter
      2 (2014-01-29 11:51:40) TIMER_START{handleError:status=403}
      6 (2014-01-29 11:51:40) TIMER_END{4,handleError:status=403} Using handler /libs/sling/servlet/errorhandler/default.jsp
     22 (2014-01-29 11:51:40) LOG Found processor for post processing ProcessorConfiguration: {contentTypes=[text/html],order=-1, active=true, valid=true, processErrorResponse=true, pipeline=(generator=Config(type=htmlparser, config={}), transformers=(Config(type=linkchecker, config={}), Config(type=mobile, config=org.apache.sling.jcr.resource.JcrPropertyMap@49f984de), Config(type=mobiledebug, config=org.apache.sling.jcr.resource.JcrPropertyMap@1c8230c3), Config(type=contentsync, config=org.apache.sling.jcr.resource.JcrPropertyMap@274f60d4), serializer=Config(type=htmlwriter, config={}))}
     23 (2014-01-29 11:51:40) TIMER_END{23,Request Processing} Dumping SlingRequestProgressTracker Entries
ApacheSling/2.2 (Day-Servlet-Engine/4.1.42, OpenJDK 64-Bit Server VM 1.7.0_51, Linux 2.6.32-431.3.1.el6.x86_64 amd64)

我尝试检查日志,但没有任何内容(只是找不到/favicon.ico 的信息消息)

编辑2 当我将请求更改为 POST 并将 servlet 更改为处理 POST 请求时,错误消息更改为 HTTP 500

javax.jcr.RepositoryException: org.apache.sling.api.resource.PersistenceException: Resource at '/myservices/saveandinvite' is not modifiable

最佳答案

这是一个开始排序问题。您假设该服务在 bundle 启动之前就已经可用并已注册,但这种假设是不安全的(事实上 null 表明它是不正确的)。

您应该将声明性服务与@Reference 注释一起使用。我不明白为什么你说这会导致 HTTP Forbidden 错误...这些事情之间没有联系。

关于java - OSGi bundle - 获取 DataSourcePool 以在 Adob​​e CQ5 中的 servlet 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21405410/

相关文章:

java - 在 Spring Boot 应用程序中为 Activiti 指定单独的数据源

Eclipse kepler 的 Java 反编译器

java - 无法解析 FIrestore "Timestamp"字段

java - 如何创建具有可选包解析的工作 OSGi 包?

java - 如何在KURA框架中配置apache CAMEL

datasource - 在tableau中用空白替换多个空值列

spring - Spring Boot 中的多个数据源和模式创建

java - Apache HttpClient 中未修改的 ArrayList 中的 ConcurrentModificationException

java - 从文件中读取特定值

java - 在 Apache Karaf 的日志文件中打印 System.out.println