启用 Jackrabbit 的搜索索引时出现 NullPointerException

发布于 2025-01-05 12:18:08 字数 9066 浏览 1 评论 0原文

我目前正在开发积极使用 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.findAuthorizeds 我必须在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 配置部分中列出的用户。但为什么?我缺少什么?

I'm currently developing application that actively uses jackrabbit. This is my first experience with jackrabbit. I use h2-based configuration for my junit tests. Lucene search was disabled in my repository.xml and the only problem was the following exception in log file:

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

All unit tests passed. When I started to test functionality that uses UserManager.findAuthorizables I had to enable SearchIndex in repository.xml.
Now all of my tests fail with frustrating 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)
    ...

Here is my repository.xml, which uses default search index configuration:

<?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>

Repository startup code:

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);
        }
    }
    ...
}

I've found this problem on Jackrabbit 2.3.4. I've tried to use recently released 2.4.0 - no success.
It seems that jackrabbit fails to create users listed in LoginModule configuration section. But why? What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懷念過去 2025-01-12 12:18:08

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

My mistake.
I've checked my ivy repository and found that apache lucene was published by newer version 3.3.0. Jackrabbit in it's distribution uses lucene 3.0.3
When I published "jackrabbit friendly" lucene version tests began to pass.

眼藏柔 2025-01-12 12:18:08

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

如果您想使用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>

然后重新启动您的实例。

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

I know this question is so old. But I would answer it for new comers who got this error.

If you want to use the search function of Repository you need to configure it manually. When it cannot find configuration for search manager in workspace, it means SearchIndex tag in workspace.xml is inactive properly.

Here is how to do this:

open file ./jackrabbit/workspaces/your_workspace/worspace.xml
add or active the following between

<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
    <param name="path" value="${wsp.home}/index"/>
    <param name="extractorPoolSize" value="2"/>
</SearchIndex>

Then restart your instance.

Note: I recommend you to copy SearchIndex tag from your repository.xml in workspace.xml.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文