2017-07-12 6 views
1

私はspring/mybatisアプリケーションで動作するようにテラコッタサーバーを設定しようとしていますが、次のエラーが発生します。それは、キー自体またはキーから返された値をシリアル化できないことを意味するかどうかはわかりません。キャッシュはローカルキャッシュとして正常に機能しましたが、現在はサーバーでの作業に問題があります。私はこれがなぜ直列化できないのかという手がかりが必要です。ありがとう。テラコッタサーバーの分散設定のehcacheエラーのシリアル化

私はこのHow do you serialize a Spring Bean (spring 3)からセッションスコープの欠如と関係があるかもしれないという手がかりを得ました。これらのエラーは、Tomcatを起動して最初のWebページがロードされているときに発生します。私は、サイトBeanクラスにjava.io.Serializableを実装し、そのエラーを通過して、呼び出された次のBeanに移動しました。これを多くの豆に追加した後、A、これが正しいことなのか、これらの春のクラスでjava.io.Serializableの実装を強制することによる副作用があるのだろうか?そしてB:私はこのアプリケーションで多くの豆を持っているので、これを行うより良い方法はありますか?

SEVERE: Servlet.service() for servlet [ezreg] in context with path [] threw exception [Request processing failed; nested exception is net.sf.ehcache.CacheException: The value [email protected] for key getSiteByHostname127.0.0.1 is not Serializable. Consider using Element.getObjectValue()] with root cause 
net.sf.ehcache.CacheException: The value [email protected] for key getSiteByHostname127.0.0.1 is not Serializable. Consider using Element.getObjectValue() 
    at net.sf.ehcache.Element.getValue(Element.java:326) 
    at net.sf.ehcache.ElementData.<init>(ElementData.java:35) 
    at net.sf.ehcache.EternalElementData.<init>(EternalElementData.java:19) 
    at org.terracotta.modules.ehcache.store.ValueModeHandlerSerialization.createElementData(ValueModeHandlerSerialization.java:48) 
    at org.terracotta.modules.ehcache.store.ClusteredStore.doPut(ClusteredStore.java:745) 
    at org.terracotta.modules.ehcache.store.ClusteredStore.putInternal(ClusteredStore.java:291) 
    at org.terracotta.modules.ehcache.store.ClusteredStore.put(ClusteredStore.java:263) 
    at org.terracotta.modules.ehcache.store.ClusteredSafeStore.put(ClusteredSafeStore.java:247) 
    at org.terracotta.modules.ehcache.store.nonstop.NonStopStoreWrapper.put(NonStopStoreWrapper.java:820) 
    at net.sf.ehcache.Cache.putInternal(Cache.java:1617) 
    at net.sf.ehcache.Cache.put(Cache.java:1543) 
    at net.sf.ehcache.Cache.put(Cache.java:1508) 
    at org.springframework.cache.ehcache.EhCacheCache.put(EhCacheCache.java:121) 
    at org.springframework.cache.interceptor.AbstractCacheInvoker.doPut(AbstractCacheInvoker.java:85) 
    at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:784) 
    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:417) 
    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:327) 
    at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy56.getSiteByHostname(Unknown Source) 
    at com.trifecta.src.ezreg.daos.SiteDaoImpl.getSiteByHostname(SiteDaoImpl.java:35) 


doa method: 
    public Site getSiteByHostname(String hostname) {   
     return getSiteMapper().getSiteByHostname(hostname); 
    } 

マッパー方法:

@Cacheable(cacheNames="siteCache", key="#root.methodName.concat(#root.args)") 
Site getSiteByHostname(String hostname); 

サイトBeanが返さ:

package com.trifecta.src.ezreg.beans; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlTransient; 

@XmlRootElement 
public class Site { 
    public static String ADMIN_CURRENT_SITE = "adminCurrentSite"; 
    public static String _CURRENT_SITE = "currentSite"; 

    @XmlAttribute 
    private Long id; 

    @XmlAttribute 
    private String name; 

    @XmlAttribute 
    private String supportphonenumber; 

    @XmlElement 
    private SitePreference sitePreference; 

    @XmlElement 
    private SiteInterfaceDevice siteInterfaceDevice; 

    @XmlElement 
    private SitePdfFormat sitePdfFormat; 

    @XmlAttribute 
    private boolean ecum; 

    @XmlTransient 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    @XmlTransient 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    @XmlTransient 
    public SiteInterfaceDevice getSiteInterfaceDevice() { 
     return siteInterfaceDevice; 
    } 
    public void setSiteInterfaceDevice(SiteInterfaceDevice siteInterfaceDevice) { 
     this.siteInterfaceDevice = siteInterfaceDevice; 
    } 
    @XmlTransient 
    public SitePdfFormat getSitePdfFormat() { 
     return sitePdfFormat; 
    } 
    public void setSitePdfFormat(SitePdfFormat sitePdfFormat) { 
     this.sitePdfFormat = sitePdfFormat; 
    } 
    @XmlTransient 
    public SitePreference getSitePreference() { 
     return sitePreference; 
    } 
    public void setSitePreference(SitePreference sitePreference) { 
     this.sitePreference = sitePreference; 
    } 
    @XmlTransient 
    public String getSupportphonenumber() { 
     return supportphonenumber; 
    } 
    public void setSupportphonenumber(String supportphonenumber) { 
     this.supportphonenumber = supportphonenumber; 
    } 
    @XmlTransient 
    public boolean getEcum() { 
     return ecum; 
    } 
    public void setEcum(boolean ecum) { 
     this.ecum = ecum; 
    } 
} 


public class Site implements java.io.Serializable{ 
    public static String ADMIN_CURRENT_SITE = "adminCurrentSite"; 
    public static String _CURRENT_SITE = "currentSite"; 

答えて

1

をローカルにキャッシュするとき、あなたはヒープメモリを使用してセットアップを持つことができるだけので、あなたの鍵には何の要件はありません/キャッシュに格納された値。

クラスタリングや実際にヒープ以外のキャッシュ層に移動した瞬間に、キーと値はSerializableを実装する必要があります。これは、マップ上でマッピングを保存/発送する唯一の方法です。

あなたのケースでは、com.trifecta.src.ezreg.beans.Siteのタイプはimplement Serializableではありません。

次の2つのオプションがあります。implement Serializable

  1. 更新型の定義をし、それが真実であることを確認してください - それは、それだけでシリアライズすることができるもので非直列化可能な値に変換しSerializableフィールド
  2. を持っています。

Ehcache 3では、Javaシリアル化に制限されないカスタム・シリアライザを指定することができます。

+0

ありがとうございます。 :) –

+0

あなたはまだ何かが不足していない限り、答えを受け入れてください...? –

関連する問題