alibaba / jetcache

JetCache is a Java cache framework.
Apache License 2.0
4.96k stars 1.03k forks source link

spring项目引入jetcache启动报错 #857

Closed garveyhu closed 5 months ago

garveyhu commented 5 months ago

jetcache新手,项目引入jetcache报错 jetcache2.7.5 jdk21 springboot3.2.1

2024-02-20 17:40:23 WARN [main] AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.alicp.jetcache.autoconfigure.JetCacheAutoConfiguration]: Error processing condition on com.alicp.jetcache.autoconfigure.RedisAutoConfiguration 2024-02-20 17:40:23 INFO [main] ConditionEvaluationReportLogger -

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-02-20 17:40:23 ERROR [main] SpringApplication - Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.alicp.jetcache.autoconfigure.JetCacheAutoConfiguration]: Error processing condition on com.alicp.jetcache.autoconfigure.RedisAutoConfiguration at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:544) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:321) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:246) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:534) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.lambda$processGroupImports$1(ConfigurationClassParser.java:746) ~[spring-context-6.1.2.jar:6.1.2] at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:743) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:714) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:183) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:416) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:789) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.1.jar:3.2.1] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) [spring-boot-3.2.1.jar:3.2.1] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:464) [spring-boot-3.2.1.jar:3.2.1] at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) [spring-boot-3.2.1.jar:3.2.1] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1358) [spring-boot-3.2.1.jar:3.2.1] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1347) [spring-boot-3.2.1.jar:3.2.1] at com.archeruu.GeneralApplication.main(GeneralApplication.java:15) [classes/:?] Caused by: java.lang.IllegalStateException: Error processing condition on com.alicp.jetcache.autoconfigure.RedisAutoConfiguration at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60) ~[spring-boot-autoconfigure-3.2.1.jar:3.2.1] at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:220) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:534) ~[spring-context-6.1.2.jar:6.1.2] ... 21 more Caused by: java.lang.StringIndexOutOfBoundsException: Range [0, -1) out of bounds for length 8 at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55) ~[?:?] at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52) ~[?:?] at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213) ~[?:?] at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210) ~[?:?] at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98) ~[?:?] at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112) ~[?:?] at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349) ~[?:?] at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4861) ~[?:?] at java.base/java.lang.String.substring(String.java:2830) ~[?:?] at com.alicp.jetcache.autoconfigure.JetCacheCondition.lambda$match$0(JetCacheCondition.java:40) ~[jetcache-autoconfigure-2.7.5.jar:?] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?] at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1715) ~[?:?] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[?:?] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[?:?] at com.alicp.jetcache.autoconfigure.JetCacheCondition.match(JetCacheCondition.java:40) ~[jetcache-autoconfigure-2.7.5.jar:?] at com.alicp.jetcache.autoconfigure.JetCacheCondition.getMatchOutcome(JetCacheCondition.java:31) ~[jetcache-autoconfigure-2.7.5.jar:?] at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[spring-boot-autoconfigure-3.2.1.jar:3.2.1] at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:220) ~[spring-context-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:534) ~[spring-context-6.1.2.jar:6.1.2] ... 21 more

这是我的使用步骤

一、导入依赖

<properties>
    <jetcache.version>2.7.5</jetcache.version>
</properties>

<!-- jetcache -->
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-starter-redis</artifactId>
    <version>${jetcache.version}</version>
</dependency>

二、spring配置

XXXApplication.java

@SpringBootApplication
@EnableMethodCache(basePackages = "com.archeruu")
public class MySpringBootApp {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApp.class);
    }
}

apllication.yml

jetcache:
  statIntervalMinutes: 1
  areaInCacheName: false
  local:
    default:
      type: caffeine
      limit: 1000
      keyConvertor: fastjson2
  remote:
    default:
      type: redis
      keyConvertor: fastjson2
      valueEncoder: java
      valueDecoder: java
    poolConfig:
      minIdle: 5
      maxIdle: 20
      maxTotal: 50
    host: 127.0.0.1
    port: 6379
    database: 0
    password: 123456

三、使用jetcache

package com.archeruu.api.cache;

import com.archeruu.api.entity.User;

/**
 * @author Archer
 */
public interface UserCache {

    /**
     * 保存或更新用户
     *
     * @param user 用户
     */
    void saveOrUpdate(User user);

    /**
     * 删除用户
     *
     * @param id 用户id
     */
    void delete(Long id);

    /**
     * 根据id查找用户
     *
     * @param id 用户id
     * @return 用户
     */
    User findById(Long id);
}
package com.archeruu.api.cache.impl;

import com.alicp.jetcache.anno.CacheInvalidate;
import com.alicp.jetcache.anno.CacheUpdate;
import com.alicp.jetcache.anno.Cached;
import com.archeruu.api.cache.UserCache;
import com.archeruu.api.entity.User;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;

/**
 * @author Archer
 */
@Log4j2
@Service
public class UserCacheImpl implements UserCache {

    /**
     * {@inheritDoc}
     */
    @Override
    @CacheUpdate(name="userCache-", key="#user.id", value="#user")
    public void saveOrUpdate(User user) {
        log.info("Save or update user: {}", user);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @CacheInvalidate(name="userCache-", key="#id")
    public void delete(Long id) {
        log.info("Delete user: {}", id);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Cached(name="userCache-", key="#id", expire = 3600)
    public User findById(Long id) {
        log.info("Find user by id: {}", id);
        return new User(id, "User" + id, 22);
    }
}
package com.archeruu.api.cache;

import static org.junit.jupiter.api.Assertions.*;

import com.archeruu.api.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class UserCacheTest {

    @Autowired
    private UserCache userCache;

    @Test
    void saveOrUpdate() {
        Long userId = 1L;
        User user = new User(userId, "Test User", 25);
        userCache.saveOrUpdate(user);
    }

    @Test
    void delete() {
        Long userId = 1L;
        userCache.delete(userId);
    }

    @Test
    void findById() {
        Long userId = 1L;
        User user = userCache.findById(userId);
        assertNotNull(user);
        assertEquals(userId, user.getId());
    }
}

但是启动报错不知道为啥

areyouok commented 5 months ago

从你给的错误看,是jetcache解析apllication.yml的时候出现了异常,但我一眼也没看出你的apllication.yml有什么问题。

你可以:

  1. 源代码的samples目录下有很多例子,可以main方法运行,你基于那些例子改改看。
  2. 在ide里面运行的时候,在JetCacheCondition的40行那里打个断点,然后看看怎么回事。
garveyhu commented 5 months ago

yml配置写错了,缩进有误,调整后正常使用,谢谢提醒!