【问题标题】:Got NullPointerException when enabled search index for Jackrabbit为 Jackrabbit 启用搜索索引时出现 NullPointerException
【发布时间】:2012-02-15 11:49:49
【问题描述】:

我目前正在开发积极使用jackrabbit 的应用程序。这是我第一次接触jackrabbit。我使用基于 h2 的配置进行我的 junit 测试。 Lucene 搜索在我的 repository.xml 中被禁用,唯一的问题是日志文件中出现以下异常:

ERROR org.apache.jackrabbit.core.security.user.MembershipCache  - Failed to retrieve membership references of 21232f29-7a57-35a7-8389-4a0e4a801fc3. 
javax.jcr.RepositoryException: no search manager configured for this workspace

所有单元测试都通过了。当我开始测试使用 UserManager.findAuthorizables 的功能时,我必须在 repository.xml 中启用 SearchIndex。
现在我的所有测试都失败了,令人沮丧的 NullPointerException:

java.lang.NullPointerException
    at org.apache.jackrabbit.core.query.lucene.MultiScorer.nextDoc(MultiScorer.java:68)
    at org.apache.lucene.search.ConjunctionScorer.<init>(ConjunctionScorer.java:42)
    at org.apache.lucene.search.ConjunctionScorer.<init>(ConjunctionScorer.java:33)
    at org.apache.lucene.search.BooleanScorer2$2.<init>(BooleanScorer2.java:173)
    at org.apache.lucene.search.BooleanScorer2.countingConjunctionSumScorer(BooleanScorer2.java:173)
    at org.apache.lucene.search.BooleanScorer2.makeCountingSumScorerSomeReq(BooleanScorer2.java:234)
    at org.apache.lucene.search.BooleanScorer2.makeCountingSumScorer(BooleanScorer2.java:211)
    at org.apache.lucene.search.BooleanScorer2.<init>(BooleanScorer2.java:101)
    at org.apache.lucene.search.BooleanQuery$BooleanWeight.scorer(BooleanQuery.java:328)
    at org.apache.jackrabbit.core.query.lucene.ChildAxisQuery$ChildAxisWeight.scorer(ChildAxisQuery.java:334)
    at org.apache.jackrabbit.core.query.lucene.ChildAxisQuery$ChildAxisWeight.scorer(ChildAxisQuery.java:332)
    at org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisWeight.scorer(DescendantSelfAxisQuery.java:395)
    at org.apache.jackrabbit.core.query.lucene.LuceneQueryHits.<init>(LuceneQueryHits.java:52)
    at org.apache.jackrabbit.core.query.lucene.JackrabbitIndexSearcher.evaluate(JackrabbitIndexSearcher.java:107)
    at org.apache.jackrabbit.core.query.lucene.JackrabbitIndexSearcher.execute(JackrabbitIndexSearcher.java:85)
    at org.apache.jackrabbit.core.query.lucene.SearchIndex.executeQuery(SearchIndex.java:814)
    at org.apache.jackrabbit.core.query.lucene.SingleColumnQueryResult.executeQuery(SingleColumnQueryResult.java:74)
    at org.apache.jackrabbit.core.query.lucene.QueryResultImpl.getResults(QueryResultImpl.java:275)
    at org.apache.jackrabbit.core.query.lucene.SingleColumnQueryResult.<init>(SingleColumnQueryResult.java:66)
    at org.apache.jackrabbit.core.query.lucene.QueryImpl.execute(QueryImpl.java:134)
    at org.apache.jackrabbit.core.query.QueryImpl$1.perform(QueryImpl.java:132)
    at org.apache.jackrabbit.core.query.QueryImpl$1.perform(QueryImpl.java:129)
    at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
    at org.apache.jackrabbit.core.query.QueryImpl.execute(QueryImpl.java:128)
    at org.apache.jackrabbit.core.security.user.IndexNodeResolver.findNode(IndexNodeResolver.java:73)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.getAuthorizable(UserManagerImpl.java:465)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.setPrincipal(UserManagerImpl.java:698)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.createUser(UserManagerImpl.java:558)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.createUser(UserManagerImpl.java:541)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.createAdmin(UserManagerImpl.java:948)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.getAuthorizable(UserManagerImpl.java:426)
    at org.apache.jackrabbit.core.DefaultSecurityManager.createSystemUsers(DefaultSecurityManager.java:613)
    at org.apache.jackrabbit.core.DefaultSecurityManager.init(DefaultSecurityManager.java:204)
    at org.apache.jackrabbit.core.RepositoryImpl.initSecurityManager(RepositoryImpl.java:463)
    at org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:324)
    at org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:582)
    at org.apache.jackrabbit.core.TransientRepository$2.getRepository(TransientRepository.java:232)
    at org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:280)
    at org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:376)
    at ru.e.e.s.s.BaseJackrabbitRelatedTests.startRepository(BaseJackrabbitRelatedTests.java:81)
    at ru.e.e.s.s.BaseJackrabbitRelatedTests.setUp(BaseJackrabbitRelatedTests.java:64)
    at ru.e.e.s.s.i.p.JackrabbitIdentityRepositoryTests.setUp(JackrabbitIdentityRepositoryTests.java:28)
    ...

这是我的repository.xml,它使用默认的搜索索引配置:

<?xml version="1.0"?> 
<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 2.0//EN" "http://jackrabbit.apache.org/dtd/repository-2.0.dtd">
<Repository>
    <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
        <param name="driver" value="org.h2.Driver"/>
        <param name="url" value="jdbc:h2:memFS:test"/>
    </FileSystem>
    <DataStore class="org.apache.jackrabbit.core.data.FileDataStore"/>
    <Security appName="Jackrabbit">
        <SecurityManager class="org.apache.jackrabbit.core.DefaultSecurityManager" workspaceName="security">
            <WorkspaceAccessManager class="org.apache.jackrabbit.core.security.simple.SimpleWorkspaceAccessManager"/> 
        </SecurityManager>
        <AccessManager class="org.apache.jackrabbit.core.security.DefaultAccessManager" />
        <LoginModule class="org.apache.jackrabbit.core.security.authentication.DefaultLoginModule">
            <param name="adminId" value="admin"/>
            <param name="anonimousId" value=""/>
        </LoginModule>
    </Security>
    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
    <Workspace name="${wsp.name}">
        <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:memFS:testWsp"/>
        </FileSystem>
        <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:mem:itemState"/>
        </PersistenceManager>
        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
            <param name="path" value="${wsp.home}/index"/>
            <param name="extractorPoolSize" value="2"/>
        </SearchIndex>
    </Workspace>
    <Versioning rootPath="${rep.home}/version">
        <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:memFS:test/version"/>
        </FileSystem>
        <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:mem:version;db_close_delay=10"/>
        </PersistenceManager>
    </Versioning>
    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
        <param name="path" value="${rep.home}/repository/index"/>
        <param name="extractorPoolSize" value="2"/>
    </SearchIndex>
</Repository>

存储库启动代码:

public abstract class BaseJackrabbitRelatedTests {
    protected static Repository testRepository;
    protected static Credentials adminCredentials;
    private Session keepAliveSession;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        cleanRepository();
        testRepository = new TransientRepository(JACKRABBIT_CONFIGURATION_FILE, JACKRABBIT_REPOSITORY_PATH);
        adminCredentials = new SimpleCredentials(JACKRABBIT_USERNAME, JACKRABBIT_PASSWORD.toCharArray());
    }

    private static void cleanRepository() throws Exception {
        FileUtils.deleteQuietly(new File(JACKRABBIT_REPOSITORY_PATH));
    }

    @Before
    public void setUp() throws Exception {
        startRepository();
        ...
    }

    private void startRepository() throws Exception {
        if (keepAliveSession == null) {
            keepAliveSession = testRepository.login(adminCredentials, JACKRABBIT_DEFAULT_WORKSPACE);
        }
    }
    ...
}

我在 Jackrabbit 2.3.4 上发现了这个问题。我尝试使用最近发布的 2.4.0 - 没有成功。
Jackrabbit 似乎无法创建 LoginModule 配置部分中列出的用户。但为什么?我错过了什么?

【问题讨论】:

    标签: junit lucene jackrabbit


    【解决方案1】:

    我的错误。
    我检查了我的 ivy 存储库,发现 apache lucene 是由更新版本 3.3.0 发布的。 Jackrabbit 在其发行版中使用 lucene 3.0.3
    当我发布“jackrabbit friendly” lucene 版本测试开始通过。

    【解决方案2】:

    我知道这个问题太老了。但我会为遇到此错误的新人回答。

    如果要使用Repository的搜索功能,需要手动配置。当在工作空间中找不到搜索管理器的配置时,表示 workspace.xml 中的 SearchIndex 标签已正常处于非活动状态。

    这里是如何做到这一点:

    打开文件 ./jackrabbit/workspaces/your_workspace/worspace.xml 在

    之间添加或激活以下内容
    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
        <param name="path" value="${wsp.home}/index"/>
        <param name="extractorPoolSize" value="2"/>
    </SearchIndex>
    

    然后重新启动您的实例。

    注意:我建议您将 SearchIndex 标签从您的 repository.xml 复制到 workspace.xml。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多