Как установить ограничение кэша для класса Spring CachingMetadataReaderFactory - PullRequest
0 голосов
/ 24 сентября 2019

Я начал получать следующее исключение при запуске приложения Spring (не Spring Boot):

org.springframework.beans.factory.BeanDefinitionStoreException: не удалось прочитать класс компонента-кандидата: URL [jar: файл: / E: /Program%20files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.27/webapps/online/WEB-INF/lib/CastleModel-1.1.89.jar / ком / кремовый / mhmdmnd /DocumentInformation.class];Вложенным исключением является java.lang.ArrayIndexOutOfBoundsException: 52264

Я установил точку останова на ClassPathScanningCandidateComponentProvider.findCandidateComponents.В конечном итоге сам метод вызывает метод CachingMetadataReaderFactory.getMetadataReader.Вот внутренности этого метода:

    public MetadataReader getMetadataReader(Resource resource) throws IOException {
    if (getCacheLimit() <= 0) {
        return super.getMetadataReader(resource);
    }
    synchronized (this.classReaderCache) {
        MetadataReader metadataReader = this.classReaderCache.get(resource);
        if (metadataReader == null) {
            metadataReader = super.getMetadataReader(resource);
            this.classReaderCache.put(resource, metadataReader);
        }
        return metadataReader;
    }
}

При отладке я обнаружил, что classReaderCache, который является Map<Resource, MetadataReader>, имеет начальный размер 256, который является размером кэша по умолчанию.И этот кеш на момент чтения компонентов содержит всего 256 классов.Так что ресурса DocumentInformation.class там нет.В конце я получаю исключение ArrayIndexOutOfBounds.

Я уверен, что есть способ увеличить этот лимит.Я попытался добавить следующее определение компонента в файл конфигурации:

<bean id="cachingReader" class="org.springframework.core.type.classreading.CachingMetadataReaderFactory">
    <property name="cacheLimit" value="512"/>
</bean>

Но это не помогло.Фактически, я полагал, что добавление вышеупомянутой строки должно решить проблему, но я не понимаю, почему это не сработало.Есть ли другой способ установить ограничение кеша?Или у меня есть больше чем нормальное количество зависимостей в моем classpath?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...