2016-03-07 90 views
5

我在springBatch步驟中爲閱讀器設置了ItemRepositoryReader。RepositoryItemReader找不到帶參數的方法

public ItemReader<EcheanceEntity> reader(){ 
    RepositoryItemReader<EcheanceEntity> reader = new RepositoryItemReader<EcheanceEntity>(); 
    reader.setRepository(echeanceRepository); 
    reader.setMethodName("findById"); 
    List parameters = new ArrayList(); 
    long a = 0; 
    parameters.add(a); 
    reader.setArguments(parameters); 
    Map<String, Direction> sort = new HashMap<String, Direction>(); 
    sort.put("id", Direction.ASC); 
    reader.setSort(sort); 
    return reader; 
} 

這是我的存儲庫中的行。

public interface EcheanceRepository extends JpaRepository<EcheanceEntity, Long>{ 


public EcheanceEntity findById(long id); 

@Override 
public List<EcheanceEntity> findAll(); 

如果使用方法findAll(),所以沒有任何參數,它工作正常。但是如果我使用方法findById(long id),我從ItemRepositoryReader中得到「no such method exception,findById(java.lang.Long,org.springframework.data.domain.PageRequest)」。當我通過立即使用存儲庫進行測試時,該方法沒有使用讀取器就能正常工作。

謝謝。

+0

因爲該方法不存在。還有什麼使用是一個可尋址的參數與ID查找?也已經提供了'findById'或者實際上'findOne'以及'findAll',所以我建議你從你自己的倉庫中移除它們。他們不添加任何東西。 –

+0

感謝您的回覆。即使我使用findOne(long id),它通過立即從存儲庫中使用,但不通過閱讀器可以正常工作。 – Azhenot

+0

因爲在讀者中使用'findOne'沒有意義,所以'findOne'或'findById'需要'Pageable'參數是有意義的。你正在檢索一個ID爲id的元素,你將如何排序/頁面? –

回答

4

您需要定義方法爲:

public interface EcheanceRepository extends JpaRepository<EcheanceEntity, Long> { 

    public Page<EcheanceEntity> findById(long id, Pageable pageable); 
    ... 

在該方法的描述RepositoryItemReader.setMethodName你可以找到它的原因:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/data/RepositoryItemReader.html#setMethodName-java.lang.String-

public void setMethodName(java.lang.String methodName) 

指定用什麼方法上要調用的存儲庫。 此方法必須 將Pageable作爲最後一個參數

相關問題