0

SpringとData JPAを学んでいます。Ehcache に問題があります。データベースからいくつかのレコードを返すメソッドの 1 つの戻り値をキャッシュしたいと考えています。これは、事前に設定された Ehcache インスタンスを使用した演習です (私が推測します)。問題は、注釈 @Cacheable を使用して、戻り値をキャッシュする必要があるメソッドとしてメソッドをマークできないことです。互換性のない型のコンパイル エラーが発生します (必須: ブール値、見つかった: 文字列)。これは、@Cacheable をここに配置する必要があると思われるサービス層のクラスの 1 つです (私は正しいですか?)。

package wad.datatables.service;

import javax.persistence.Cacheable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import wad.datatables.domain.Book;
import wad.datatables.repository.BookRepository;
import wad.datatables.view.DataTablesResponse;

@Service
public class JpaDataTablesBookService implements DataTablesBookService {

    @Autowired
    private BookRepository bookRepository;    

    @Override
    @Transactional(readOnly = true) 
    @Cacheable("books")
    public DataTablesResponse getBooks(String queryString) {
        Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "title");

        Page<Book> page = bookRepository.findByTitleContaining(queryString, pageable);

        DataTablesResponse response = new DataTablesResponse();
        response.setTotalRecords(page.getTotalElements());
        response.setTotalDisplayRecords(page.getNumberOfElements());
        response.setData(page.getContent());

        return response;
    }
}

そして私のリポジトリレイヤー(1つのクラスのみ):

package wad.datatables.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import wad.datatables.domain.Book;

public interface BookRepository extends JpaRepository<Book, Long> {        
    Page<Book> findByTitleContaining(String title, Pageable pageable);
}

そして、ここに私の設定ファイルがあります:

cache.xml (WEB-INF/spring/ にあります):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/cache 
            http://www.springframework.org/schema/cache/spring-cache.xsd">

    <cache:annotation-driven cache-manager="cacheManager" />

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcache"/>
    </bean>

    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml" />
    </bean>
</beans>

および ehcache.xml (src/main/resources にあります):

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="ehcache.xsd" 
         updateCheck="true" 
         monitoring="autodetect" 
         dynamicConfig="true">
    <cache name="books" maxEntriesLocalHeap="1000" eternal="true" memoryStoreEvictionPolicy="LRU"/>
</ehcache>
4

1 に答える 1

5

エラーは、間違った Cacheable アノテーションを使用しているためです。javax.persistence.Cacheable使用する代わりにorg.springframework.cache.annotation.Cacheable

于 2013-10-08T05:03:26.463 に答える