【问题标题】:Spring cache - "Null key returned for cache operation"Spring cache - “为缓存操作返回空键”
【发布时间】:2017-07-07 11:05:04
【问题描述】:
@Transactional
@Repository
@RepositoryDefinition(domainClass = UserApi.class, idClass = String.class)
public interface UserApiRepository{

    @Cacheable(value="byUserId",key="#userId")
    List<UserApi> findByUserId(String userId);

    @CacheEvict(value="byUserId",key="#userApi.userId")
    void save(UserApi userApi);
}

UsrApi.java

@Entity
@Table(name = "user_api")
public class UserApi {
    private String id;
    private String userId;
    private String api;
    private String platform;
    private String apiType;

    @Id
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getApi() {
        return api;
    }

    public void setApi(String api) {
        this.api = api;
    }

    public String getPlatform() {
        return platform;
    }

    public void setPlatform(String platform) {
        this.platform = platform;
    }

    public String getApiType() {
        return apiType;
    }

    public void setApiType(String apiType) {
        this.apiType = apiType;
    }
}

添加key="#userId"时出错。

java.lang.IllegalArgumentException: Null key returned for cache operation
(maybe you are using named params on classes without debug info?)
Builder[public abstract java.util.List com.awinson.repository.UserApiRepository.findByUserId(java.lang.String)]
caches=[byUserId] | key='#userId' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'

当我使用“save”方法时,它不会更新缓存。

【问题讨论】:

  • 你能把UserApi类的代码也贴出来吗?
  • 我贴出UserApi类的代码。
  • 那么您有一个用户 ID 为空的用户吗?您同时拥有getIdgetUserId 的事实听起来令人担忧……哪个是用户的标识符?
  • 用户的userId标识符

标签: java spring caching


【解决方案1】:

你可以尝试用 p0 替换 key

@Transactional @Repository @RepositoryDe​​finition(domainClass = UserApi.class, idClass = String.class) 公共接口 UserApiRepository{

    @Cacheable(value="byUserId",key="#p0")
    List<UserApi> findByUserId(String userId);

    @CacheEvict(value="byUserId",key="#p0.userId")
    void save(UserApi userApi);
}

参考自 Spring Cache Abstraction VS interfaces VS key param ("Null key returned for cache operation" error)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 2015-04-17
    • 1970-01-01
    • 2013-12-05
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    相关资源
    最近更新 更多