2016-03-07 2 views
5

Ich richte einen ItemRepositoryReader für den Leser in einem SpringBatch-Schritt ein.RepositoryItemReader findet keine Methoden mit Argumenten

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; 
} 

Dies ist die Zeile in meinem Repository.

public interface EcheanceRepository extends JpaRepository<EcheanceEntity, Long>{ 


public EcheanceEntity findById(long id); 

@Override 
public List<EcheanceEntity> findAll(); 

Wenn Sie die Methode findAll() verwenden, also ohne Argumente, funktioniert es gut. Aber wenn ich die Methode findById (lange ID) verwende, bekomme ich "keine solche Methodenausnahme, findById (java.lang.Long, org.springframework.data.domain.PageRequest)" vom ItemRepositoryReader. Die Methode funktioniert einwandfrei, ohne den Reader zu verwenden, wenn ich ihn sofort mit dem Repository teste.

Vielen Dank.

+0

Weil diese Methode nicht da ist. Was nützt auch eine Suche nach ID mit einem auslagerbaren Argument? auch 'findById' oder eigentlich' findOne' ist bereits vorhanden, genauso wie 'findAll', also schlage ich vor, dass Sie sie aus Ihrem eigenen Repository entfernen. Sie fügen nichts hinzu. –

+0

Vielen Dank für Ihre Antwort. Selbst wenn ich findOne (lange ID) verwende, funktioniert es sofort, indem ich es direkt aus dem Repository, aber nicht über den Reader verwende. – Azhenot

+0

Da es nicht sinnvoll ist, 'findOne' in diesem Leser zu verwenden, macht es keinen Sinn, ein' findOne' oder 'findById' zu haben, das ein' Pageable' Argument benötigt. Sie rufen ein Element mit einer ID ab, wie werden Sie danach sortieren/paginieren? –

Antwort

4

Sie müssen die Methode definieren:

public interface EcheanceRepository extends JpaRepository<EcheanceEntity, Long> { 

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

In der Beschreibung des Verfahrens RepositoryItemReader.setMethodName Sie den Grund finden kann: 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) 

Gibt an, welche Methode auf das zu rufende Repository Diese Methode muss als letztes Argument Umlagerungsdatei verwenden.