Osgi ResourceResolverFactory和SlingRepository在服务类中为null

Osgi ResourceResolverFactory和SlingRepository在服务类中为null,osgi,aem,bundles,Osgi,Aem,Bundles,我有一个服务类,如下所示,我使用Maven部署了它,并在SlingWeb控制台上处于活动状态。当我从这个包访问方法getSearchAssetNames()时,它会根据创作实例上的AEM 6.0日志被调用 但是,通过我使用@Reference注释导出空指针异常的方式,存储库、资源解析程序工厂、查询生成器等隐式对象都会得到空指针异常 这是这个类的代码。我尝试过删除激活、停用方法、添加启动/停止方法等等,但仍然不起作用 错误日志显示: *01.07.2015 12:05:24.014 INFO[12

我有一个服务类,如下所示,我使用Maven部署了它,并在SlingWeb控制台上处于活动状态。当我从这个包访问方法
getSearchAssetNames()
时,它会根据创作实例上的AEM 6.0日志被调用

但是,通过我使用
@Reference
注释导出空指针异常的方式,存储库、资源解析程序工厂、查询生成器等隐式对象都会得到空指针异常

这是这个类的代码。我尝试过删除激活、停用方法、添加启动/停止方法等等,但仍然不起作用

错误日志显示:

*01.07.2015 12:05:24.014 INFO[127.0.0.1[143573253998]GET/content/test/en/headerfooter/jcr:content/footerpar/testassetfinder..html HTTP/1.1]com.test.example.assetfinder.assetfinder查询生成器:null 01.07.2015 12:05:24.014 INFO[127.0.0.1[143573253998]GET/content/test/en/fordheaderfooter/jcr:content/footerpar/testassetfinder..html HTTP/1.1]com.test.example.assetfinder.AssetFinderImpl jcr存储库:null 原因:java.lang.NullPointerException:null 位于com.test.example.assetfinder.AssetFinderImpl.getSearchAssetNames(AssetFinderImpl.java:61)*

有谁能帮我解决这个问题吗

            package com.test.example.assetfinder;

            import java.util.ArrayList;
            import java.util.HashMap;
            import java.util.List;
            import java.util.Map;

            import javax.jcr.RepositoryException;
            import javax.jcr.Session;

            import org.apache.felix.scr.annotations.Activate;
            import org.apache.felix.scr.annotations.Component;
            import org.apache.felix.scr.annotations.Deactivate;
            import org.apache.felix.scr.annotations.Reference;
            import org.apache.felix.scr.annotations.Service;
            import org.apache.sling.jcr.api.SlingRepository;
            import org.osgi.service.component.ComponentContext;
            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;

            import com.day.cq.search.PredicateGroup;
            import com.day.cq.search.Query;
            import com.day.cq.search.QueryBuilder;
            import com.day.cq.search.result.Hit;
            import com.day.cq.search.result.SearchResult;


            /**
             * Example Asset Finder in AEM DAM.
             */
            @Service(value=com.test.example.assetfinder.AssetFinderService.class)
            @Component
            public class AssetFinderImpl implements AssetFinderService {

                @Reference
                private QueryBuilder builder;

                @Reference
                private ResourceResolverFactory resolverFactory;

                @Reference
                private SlingRepository repository;

                private static final Logger LOGGER = LoggerFactory.getLogger(AssetFinderImpl.class);

                @Activate
                protected void activate(final ComponentContext pCtx) throws RepositoryException {
                }
                @Deactivate
                protected void deactivate(ComponentContext pCtx) throws RepositoryException {
                }

                public List<String> getSearchAssetNames() {
                    List<String> assetList = new ArrayList<String>();
                    Session session = null;
                    try {
                        LOGGER.info("Query Builder: "  +builder);
                        LOGGER.info("Resolver Factory: "  +resolverFactory);
                        LOGGER.info("JCR Repository: " +repository);

                        session = repository.loginAdministrative(null);           
                        Map<String, String> map = new HashMap<String, String>();
                        map.put("path",         "/content/dam");
                        map.put("type",         "dam:Asset");
                        map.put("nodename",     "*example*.*");
                        map.put("orderby.sort", "asc");           
                        Query query = builder.createQuery(PredicateGroup.create(map), session);
                        SearchResult result = query.getResult();

                        // Iterating over the results
                        for (Hit hit : result.getHits()) {
                            assetList.add(hit.getTitle());
                        }
                    } catch(RepositoryException re) {
                        re.printStackTrace();       
                    } finally {
                        if(null != session) {
                            session.logout();
                        }
                    }       
                    return assetList;
                }
            }
package com.test.example.assetfinder;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入javax.jcr.RepositoryException;
导入javax.jcr.Session;
导入org.apache.felix.scr.annotations.Activate;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Deactivate;
导入org.apache.felix.scr.annotations.Reference;
导入org.apache.felix.scr.annotations.Service;
导入org.apache.sling.jcr.api.SlingRepository;
导入org.osgi.service.component.ComponentContext;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.day.cq.search.PredicateGroup;
导入com.day.cq.search.Query;
导入com.day.cq.search.QueryBuilder;
导入com.day.cq.search.result.Hit;
导入com.day.cq.search.result.SearchResult;
/**
*AEM DAM中的资产查找器示例。
*/
@服务(value=com.test.example.assetfinder.AssetFinderService.class)
@组成部分
公共类AssetFinderImpl实现AssetFinderService{
@参考文献
私人查询生成器;
@参考文献
私有资源解析工厂解析工厂;
@参考文献
私有SlingRepository存储库;
私有静态最终记录器Logger=LoggerFactory.getLogger(AssetFinderImpl.class);
@激活
受保护的无效激活(最终组件上下文pCtx)引发RepositoryException{
}
@停用
受保护的无效停用(ComponentContext pCtx)引发RepositoryException{
}
公共列表getSearchAssetNames(){
List assetList=新建ArrayList();
会话=空;
试一试{
LOGGER.info(“查询生成器:“+Builder”);
LOGGER.info(“解析器工厂:+resolverFactory”);
LOGGER.info(“JCR存储库:”+存储库);
session=repository.loginAdministrative(null);
Map Map=newhashmap();
map.put(“路径”、“/content/dam”);
地图出售(“类型”、“大坝:资产”);
map.put(“节点名”,“示例*”);
map.put(“orderby.sort”、“asc”);
Query Query=builder.createQuery(PredicateGroup.create(map),session);
SearchResult=query.getResult();
//迭代结果
for(Hit-Hit:result.getHits()){
add(hit.getTitle());
}
}捕获(RepositoryException re){
关于printStackTrace();
}最后{
if(null!=会话){
session.logout();
}
}       
返回资产清单;
}
}

这里的关键是,当您使用
@Reference
时,它将服务引用注入到由服务组件运行时(SCR)管理的类的实例中,并且仅将注入到该托管实例中。如果您创建了一个新的(即不同的)类实例,那么它将不会被注入字段。这就是为什么需要使用
sling.getService()
方法来获取托管实例

最佳实践是避免实现类位于导出包中。这样,您就不能直接从JSP引用实现类;您只能引用服务接口,这样就永远不会从JSP创建新实例,从而不会遇到使用类的非托管实例的问题

关于
@Activate
@Deactivate
,只有在Activate/Deactivate方法起作用时,您才会需要这些。在这种情况下,它们不会(至少在您的代码示例中)。如果您将方法命名为
activate
deactivate
,也可以避免使用它们,但就个人而言,为了安全起见,我始终建议您使用它们,例如,如果您