2017-07-28 2 views
0

J'essaie d'ajouter des fonctionnalités personnalisées à un référentiel de données Spring. En utilisant ce comme point de départ http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour J'ai créé le code suivant:Méthodes personnalisées du référentiel de ressorts

public interface TableLock<T> { 
    void checkout(T entity); 
    void checkin(T entity, boolean cmpltBatch); 
} 


public interface BatchTableLock extends TableLock<MyEntity> { 

} 

public class BatchTableLockImpl implements BatchTableLock { 
    private static final Logger logger = LoggerFactory.getLogger(BatchTableLockImpl.class); 
    @PersistenceContext(unitName = "mysql") 
    private EntityManager em; 

    @Override 
    public void checkout(MyEntity batch) { 
    Long id = batch.getMyEntityId(); 
    try { 
     MyEntity p = em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_WRITE); 
     if (p == null) { 
      logger.error("checkout : MyEntity id {} must be valid", id); 
      throw new PessimisticLockException(); 
     } 
     if (myCondition is true) { 
      return; 
     } 
    } catch (LockTimeoutException | PessimisticLockException e) { 
     logger.error("checkout : Unable to get write lock on MyEntity id {}", id, e); 
    } 
    throw new PessimisticLockException(); 
} 

@Override 
public void checkin(MyEntity batch, boolean cmplt) { 
    Long id = batch.getMyEntityId(); 
    try { 
     MyEntity p = em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_WRITE); 
     if (p == null) { 
      logger.error("complete : MyEntity id {} must be valid", id); 
      return; 
     } 
     if (this is true) { 
      if (cmplt) { 
       yep; 
      } else { 
       nope; 
      } 
     } else if (cmplt) { 
      logger.error("complete: Unable to complete MyEntity {} with status.", id); 
     } 
    } catch (LockTimeoutException | PessimisticLockException e) { 
     logger.error("complete : Unable to get write lock on MyEntity id {}", id, e); 
    } 
} 

} 

@Repository 
public interface MyDao extends CrudRepository<MyEntity, BigInteger>, BatchTableLock { 
    ... My queries ... 
} 

malheureusement, je reçois l'erreur suivante:

org.springframework.data.mapping.PropertyReferenceException: No property checkin found for type MyEntity! 

Ce si je ne me trompe pas signifie que le printemps tente de générer une requête basée sur la méthode 'checkin' et ne peut pas trouver un champ dans MyEntity avec le nom 'checkin'. ce qui est correct, il n'y a pas un tel champ. comment puis-je faire cesser de faire cela? basé sur le lien ci-dessus je ne pense pas qu'il devrait essayer de générer une requête pour cette méthode, mais il semble le faire de toute façon. Il se peut que je manque quelque chose, c'est généralement le cas, mais je ne vois pas ce que c'est.

Répondre

2

Comme indiqué dans la section de documentation de référence à laquelle vous avez lié, vous avez besoin d'une classe MyDaoImpl qui implémente les méthodes personnalisées. Je suppose que le moyen le plus simple est soit de renommer BatchTableLockImpl à cela ou simplement créer un vide MyDaoImpl prolongeant cette classe.

+0

Merci Oliver désolé pour la confusion et ma mauvaise interprétation de la documentation. – peekay