2017-02-23 15 views
0

キャッシュからデータのリストを取得しようとすると、問題が発生します。Springキャッシュ - ClassCastException(ehcache)

CategoryServiceImpl:

@Service 
@Transactional 
public class CategoryServiceImpl implements CategoryService { 
@Resource 
private CategoryRepository categoryRepository; 

@Override 
@Caching(
     put = { 
       @CachePut(value = "category", key = "'findByParrentId-' + #category.parentId + ',' + #category.user.userId"), 
       @CachePut(value = "category", key = "'findAll-' + #category.user.userId") 
     } 
) 
public Category add(Category category) { 
    return categoryRepository.saveAndFlush(category); 
} 

@Override 
@Cacheable(cacheNames = "category", key = "'findByParrentId-' + #prntId + ',' + #userId") 
public List<Category> findByParentId(long prntId, long userId) { 
    return categoryRepository.findByParentId(prntId, userId); 
} 

@Override 
@Cacheable(cacheNames = "category", key = "'findAll-' + #userId") 
public List<Category> findAll(long userId) { 
    return categoryRepository.findAll(userId); 
} 
} 

私はカテゴリの一覧を取得しよう:

List<Category> categories = new ArrayList<>(categoryService.findByParentId(parentId, userSession.getUser().getUserId())); 

私は例外を取得:

のClassCastException:ru.mrchebik.model .Categoryはjava.util.Listにキャストできません

のフルスタックトレース:あなたはこの同じキャッシュはリストを返すことを期待し、その後

@CachePut(value = "category", key = "'findByParrentId-' + #category.parentId + ',' + #category.user.userId") 

と::http://pastebin.com/35A14ZW9

答えて

0

「カテゴリ」という名前のキャッシュはカテゴリーの要素を保持するように構成されているように思える

@Cacheable(cacheNames = "category", key = "'findAll-' + #userId") 

あなたのキャッシュには、List<Category>を保存したいと思います。 Categoryを入れるのではなく、キャッシュを温めようとするときにList<Category>と入力する必要があります。

+0

それは動作しますが、私は1つの要素しか与えません。私がすべての要素を与えたいなら、私は何をしなければならないのですか?今、私はこれを持っています: 'public List add(カテゴリカテゴリ){ categoryRepository.saveAndFlush(category); リストリスト=新しいArrayList <>(); list.add(カテゴリ); リターンリスト。 } 'Listのローカル変数を作成できますが、これはキャッシュではありません。 – shank

0

達成しようとしているのは、Springキャッシングの抽象化では機能しません。あなたが望む結果を得るためには、もっと手を加えなければなりません。

まずは、キャッシュ内のコレクションに1つの要素を追加する必要があることを表現するためにSpringキャッシングを使用する方法があります。したがって、マッピングの内容を自分で維持する必要があります。現在の宣言で

は、あなたの代わりにList<Category>のキャッシュでCategoryを持っていないだけでなく、あなただけのキーごとに、最後のCategoryを持っています。

@CachePut注釈を削除し、キャッシュ内のコレクションの更新を自分で行うことをおすすめします。

これはスレッドセーフである必要があり、より多くの考えを必要とすることに注意してください。

+0

ありがとう、 '@ CacheEvict'を' allEntries'と一緒に使うと、カテゴリのリストを得ることができます。 – shank

関連する問題