当前位置: 首页 > 知识库问答 >
问题:

ResourceResolverFactory和SlingRepository在服务类中为null

夹谷信鸿
2023-03-14

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

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

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

错误日志显示:

*01.07.2015 12:05:24.014信息[127.0.0.1[143573253998]GET/content/test/en/headerfooter/jcr:content/footerpar/testassetfinder。。html HTTP/1.1]com。测验实例资产抵押人。AssetFinderImpl查询生成器:null 01.07.2015 12:05:24.014信息[127.0.0.1[143573253998]GET/content/test/en/fordheaderfooter/jcr:content/footerpar/testassetfinder。。html HTTP/1.1]com。测验实例资产抵押人。AssetFinderImpl JCR存储库:null由:java引起。lang.NullPointerException:com上为null。测验实例资产抵押人。AssetFinder Impl。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;
                }
            }

共有1个答案

景书
2023-03-14

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

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

关于@Activate@Deactivate,只有在Activate/Deactivate方法起作用时,您才会需要这些。在这种情况下,它们不会(至少在您的代码示例中)。如果您将方法命名为activatedeactivate,您也可以不使用它们,但就个人而言,为了安全起见,我总是建议您使用它们,例如,如果您将名称错误地输入为activite或类似的名称。

 类似资料:
  • 问题内容: 我必须将数据上传到服务器。我正在使用与我的应用程序运行在同一进程上的服务。我应该使用单独的线程进行上传过程还是应该使用AsyncTask将数据上传到服务器? 更具体地说,我可以在服务类中使用AsyncTask吗?我应该使用它吗?此服务应始终在内存中运行,以便每5秒将数据发送到服务器。 问题答案: 是的,您可以,下面的代码每5秒运行一次。使用常规的连接代码发送零件。

  • 客户端 A-C 是提供 HTML 服务的 Web 应用程序。服务 1-3 是处理 CRUD 并提供 JSON 的后端。还有其他客户端(未图中)不访问前端服务 - 即本机客户端,如Android和iOS。我试图找出在所有Web客户端上提供常见前端内容(例如页眉/页脚/ css)的最佳方法。我能想到的最好的方法是创建一个前端服务,每个Web客户端都可以访问该服务来提取这些公共信息。这样,更改通用前端将

  • 我读了一些文章,看了一些视频,但在为这些微服务提供服务方面,没有找到具体的建议。我的理解是,他们应该使用自己的应用程序服务器。 我的问题是它们应该部署在不同的服务器上,还是没关系。 当它们在同一台服务器(计算机)上提供服务时,不会有端口冲突吗?

  • 问题内容: 我试图在注入控制器的单例spring服务中实现ConcurentHashMap的线程安全用法: 有没有更好的方法可以使哈希映射成为线程安全的?我如何才能使其适应集群环境?这是我的另一个问题。 问题答案: 我的目的不是要回答这个问题,特别是。因为我没有多方面的专业知识;但是,我想指出我认为值得注意的地方。 @JB Nizet在评论之一中提到该代码是 线程安全的 和 正确的 。我想根据Ja

  • 问题内容: 我有一个基类,我想在服务中进行扩展以帮助将数据输入角度范围。我已经在网上搜索了一种解决方案,但是没有找到我喜欢的解决方案。我有一个用于访问设备文件系统的基类 类结构: 我希望能够在几个不同的角度服务(即offlineCart,offlineCustomLists等)中扩展该类,其中每个服务都将能够使用存储库来存储各种不同的数据类型。我正在寻找最好,最合适的方式来做到这一点。在普通Jav

  • 我的应用程序部署和服务运行在AWS EKS集群中。通过添加此注释服务,该服务将公开为NLB类型的负载平衡器。贝塔。库伯内特斯。io/aws负载平衡器类型:nlb,但当我试图通过将注释更改为service将其切换为ALB时。贝塔。库伯内特斯。io/aws负载平衡器类型:alb它创建了一个经典的负载平衡器,这意味着不考虑此注释,所以有没有办法在alb上公开服务?