java - 使用简单的 spring memcached 进行 JSON 序列化

标签 java json spring memcached simple-spring-memcached

我无法使用 simple-spring-memcached 将默认序列化类型设置为 JSON。我得到的错误是:

java.lang.IllegalArgumentException: Cannot use JSON serialization because dedicated cache transcoder is null!
at com.google.code.ssm.CacheImpl.set(CacheImpl.java:290) ~[simple-spring-memcached-3.5.0.jar:na]
at com.google.code.ssm.CacheImpl.set(CacheImpl.java:125) ~[simple-spring-memcached-3.5.0.jar:na]
at com.google.code.ssm.PrefixedCacheImpl.set(PrefixedCacheImpl.java:130) ~[simple-spring-memcached-3.5.0.jar:na]
at com.google.code.ssm.spring.SSMCache.put(SSMCache.java:159) ~[spring-cache-3.5.0.jar:na]
at org.springframework.cache.interceptor.CacheAspectSupport.update(CacheAspectSupport.java:351) [spring-context-3.2.9.RELEASE.jar:3.2.9.RELEASE]
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:214) [spring-context-3.2.9.RELEASE.jar:3.2.9.RELEASE]
at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66) [spring-context-3.2.9.RELEASE.jar:3.2.9.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.2.9.RELEASE.jar:3.2.9.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) [spring-aop-3.2.9.RELEASE.jar:3.2.9.RELEASE]
at com.sun.proxy.$Proxy105.findByValue(Unknown Source) [na:na]

我的配置是:

    @Configuration()
    @EnableAspectJAutoProxy
    @EnableCaching
    public class SimpleSpringCacheConfig {

    @Autowired
    private Environment env;

    private static final String DEFAULT_MEMCACHED_HOST = "127.0.0.1:11211";
    private static final Integer DEFAULT_MEMCACHED_TTL_SECONDS = 3600;
    private static final Integer DEFAULT_MEMCACHED_TIMEOUT_MILLIS = 500;

    private static final String PROPERTY_MEMCACHED_HOSTS = "service.caching.memcached.hosts";
    private static final String PROPERTY_DEFAULT_TTL_SECONDS="service.caching.default.ttl.seconds";

    private static final Logger log = LoggerFactory.getLogger(SimpleSpringCacheConfig.class);

    //reference config on https://code.google.com/p/simple-spring-memcached/wiki/Getting_Started#Spring_3.1_Cache_Integration
    @Bean
    public CacheManager cacheManager() throws Exception
    {
            MemcacheClientFactoryImpl cacheClientFactory = new MemcacheClientFactoryImpl();
            AddressProvider addressProvider = new DefaultAddressProvider(env.getProperty(PROPERTY_MEMCACHED_HOSTS, DEFAULT_MEMCACHED_HOST));
            CacheConfiguration cacheConfiguration = new CacheConfiguration();

            cacheConfiguration.setKeyPrefixSeparator("_");
            cacheConfiguration.setUseNameAsKeyPrefix(true);
            cacheConfiguration.setConsistentHashing(true);
            cacheConfiguration.setOperationTimeout(DEFAULT_MEMCACHED_TIMEOUT_MILLIS);

            CacheFactory cacheFactory = new CacheFactory();
            cacheFactory.setCacheName("simpleMemcachedCache");
            cacheFactory.setCacheClientFactory(cacheClientFactory);
            cacheFactory.setAddressProvider(addressProvider);
            cacheFactory.setConfiguration(cacheConfiguration);
            cacheFactory.setDefaultSerializationType(SerializationType.JSON);

            Cache object = cacheFactory.getObject();

            int ttl = env.getProperty(PROPERTY_DEFAULT_TTL_SECONDS, Integer.class, DEFAULT_MEMCACHED_TTL_SECONDS);

            //@CacheEvict(..., "allEntries" = true) won't work because allowClear is false, 
            //so we won't flush accidentally all entries from memcached instance..
            SSMCache ssmCache = new SSMCache(object, ttl, false);

            ArrayList<SSMCache> ssmCaches = new ArrayList<SSMCache>();
            ssmCaches.add(0, ssmCache);

            SSMCacheManager ssmCacheManager = new SSMCacheManager();
            ssmCacheManager.setCaches(ssmCaches);

            return ssmCacheManager;
    }
}

根据此处的指南https://code.google.com/p/simple-spring-memcached/wiki/Getting_Started#Serialization似乎没有必要定义自定义转码器。我可能做错了什么?

我正在使用以下版本.. Spring 缓存:v3.5.0 pymemcached-provider:v3.5.0 Spring :v3.2.8.RELEASE

最佳答案

如果您使用 SSM xml 配置,则无需定义 JSON 转码器。在您的情况下,您需要完全初始化 CacheFactory 对象,因此调用:

cacheFactory.afterPropertiesSet();

就在之前

Cache object = cacheFactory.getObject();

关于java - 使用简单的 spring memcached 进行 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32343427/

相关文章:

java - 使用多线程的 JPA 中的事务

java - 再一次...... Java 应用程序中嵌入的 MySQL

c# - 如何在单元测试中验证序列化的 JSON 在 Python/C# 中是否正确?

java - JPA 2.1、Hibernate 4.3、Spring 4.0 数据未保存到数据库

java - 如何将 Java 供应商绑定(bind)到对象的实例?

java - 如何确保Java在某些代码块中不会切换线程?

java - org.json.JSONException 值 java.lang.String 类型的连接无法转换为 JSONArray

java - 直接从 Java 中的 REST API 响应流将大型 JSON 保存为文本

java - Twilio SMS api 不支持返回内容类型

java - Hibernate 在创建后立即加载对象