2016-11-13 14 views
1

Webサービスを呼び出すメソッドがあり、同じ入力引数の場合は結果をキャッシュします。 は、メインクラス::Springbootとehcacheでjava.lang.ArrayStoreExceptionを取得する

import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 
import org.springframework.cache.CacheManager; 
import org.springframework.cache.annotation.EnableCaching; 
import org.springframework.cache.ehcache.EhCacheCacheManager; 
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.core.io.ClassPathResource; 

@EnableCaching 
@ComponentScan 
@SpringBootApplication 
public class AccServer extends SpringBootServletInitializer { 

    @Bean 
    public CacheManager cacheManager() { 
     return new EhCacheCacheManager(ehCacheCacheManager().getObject()); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean ehCacheCacheManager() { 
     EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean(); 
     cmfb.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     cmfb.setShared(true); 
     return cmfb; 
    } 

} 

方法キャッシュへ:だから、ここで私はこれまで何をしたかである

import java.util.List; 

import org.springframework.cache.annotation.Cacheable; 
import org.springframework.stereotype.Service; 

@Service 
public class SomeClass implements ISomeClass { 

    @Override 
    @Cacheable("acc") 
    public List<Integer> trs() { 
     return webSrv.trs(); 
    } 

} 

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> 
    <diskStore path="java.io.tmpdir" /> 
    <cache name="acc" maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> 
</ehcache> 

そして私が手:

Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 
    at sun.reflect.annotation.AnnotationParser.parseClassArray(Unknown Source) 
    at sun.reflect.annotation.AnnotationParser.parseArray(Unknown Source) 
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(Unknown Source) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation2(Unknown Source) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(Unknown Source) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(Unknown Source) 
    at java.lang.Class.createAnnotationData(Unknown Source) 
    at java.lang.Class.annotationData(Unknown Source) 
    at java.lang.Class.createAnnotationData(Unknown Source) 
    at java.lang.Class.annotationData(Unknown Source) 
    at java.lang.Class.getAnnotation(Unknown Source) 
    at org.springframework.cache.annotation.SpringCacheAnnotationParser.getAnnotations(SpringCacheAnnotationParser.java:201) 
    at org.springframework.cache.annotation.SpringCacheAnnotationParser.parseCacheAnnotations(SpringCacheAnnotationParser.java:64) 
    at org.springframework.cache.annotation.SpringCacheAnnotationParser.parseCacheAnnotations(SpringCacheAnnotationParser.java:52) 
    at org.springframework.cache.annotation.AnnotationCacheOperationSource$1.getCacheOperations(AnnotationCacheOperationSource.java:113) 
    at org.springframework.cache.annotation.AnnotationCacheOperationSource.determineCacheOperations(AnnotationCacheOperationSource.java:142) 
    at org.springframework.cache.annotation.AnnotationCacheOperationSource.findCacheOperations(AnnotationCacheOperationSource.java:110) 
    at org.springframework.cache.interceptor.AbstractFallbackCacheOperationSource.computeCacheOperations(AbstractFallbackCacheOperationSource.java:142) 
    at org.springframework.cache.interceptor.AbstractFallbackCacheOperationSource.getCacheOperations(AbstractFallbackCacheOperationSource.java:97) 
    at org.springframework.cache.interceptor.CacheOperationSourcePointcut.matches(CacheOperationSourcePointcut.java:39) 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:211) 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:248) 
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:280) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    ... 135 more 

私も使用@Cacheable("acc")結果のためにキャッシュされるべきメソッドの注釈。 答えがあれば幸いです。

+0

あなたのコードを追加します。 @Cacheable( "acc")と@CachePut – developer

+0

@javaguyが追加されました。 – Khodabakhsh

+0

私は@Cacheputやクラス内の他の操作をキャッシングする必要があります。クラス全体を追加すると、簡単に見つけることができます。 – developer

答えて

1

問題は、あなたがsun.reflect.annotation.TypeNotPresentExceptionProxy例外を取得しているのList<Integer>オブジェクトを返すされていません(あなた@ServiceSomeClassクラスの)@Cacheabletrs()方法です。

trs()List<Integer>オブジェクトを返すようにする必要があります。

+0

私はそうではないと思います。なぜなら、return句を "new ArrayList ()"を返すように変更すると、同じ例外が返されます。 – Khodabakhsh

+0

また、アプリケーションの起動時にこの例外が発生します。 – Khodabakhsh

+0

webSrv.trs()メソッドのコードを追加して、この例外を回避するためにServiceメソッドに使用する戻り値の型を提案できますか? – developer

0

この例外は、クラスパス上に存在しないアノテーションに対してルックアップを試みたことを意味します。残念ながら、JDKはそれについて私たちに多くのことを教えてくれるわけではありませんが、最近のバージョンのフレームワーク(したがってブート)でエラーメッセージが改善されたと思います。

また、障害のあるコードにブレークポイントを追加すると、解決しようとしていることがわかります。それはあなたに欠けている注釈が何であるかのヒントを与えるはずです。ほとんどの場合、これはルックアップを行うコンポーネントと厳密には関連していません(つまり、キャッシュとは無関係かもしれません)。サンプルアプリを共有すると、簡単に把握できます。

1

それがなるように、この質問に貢献どのように仲間のおかげで、最終的には、デバッグの長い時間の後、私は、プロジェクトから2つの依存性を除くために必要があることがわかった。

  <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-actuator</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.apache.tomcat.embed</groupId> 
       <artifactId>tomcat-embed-jasper</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>javax.servlet</groupId> 
       <artifactId>jstl</artifactId> 
      </exclusion> 
関連する問題