Hi,
I have this error when I try to define a custom repository implementation to all my repositories:
2011-11-14 11:23:59.253:WARN::Nested in org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'nomenclatureRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No property delete found for type class be.leforem.nom.domain.Nomenclature:
java.lang.IllegalArgumentException: No property delete found for type class be.leforem.nom.domain.Nomenclature
Here is my repository factory bean:
Here is my custom interface:Code:package be.leforem.nom.dao.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.support.JpaRepositoryFactory; import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import javax.persistence.EntityManager; public class RepositoryFactoryBean<T extends JpaRepository<?, ?>> extends JpaRepositoryFactoryBean { private EntityManager entityManager; public void setEntityManager(final EntityManager entityManager) { this.entityManager = entityManager; super.setEntityManager(entityManager); } public RepositoryFactorySupport getRepositoryFactory() { return new RepositoryFactory(entityManager); } private static class RepositoryFactory extends JpaRepositoryFactory { private EntityManager entityManager; private RepositoryFactory(final EntityManager entityManager) { super(entityManager); this.entityManager = entityManager; } @Override protected Object getTargetRepository(final RepositoryMetadata metadata) { return new CommonRepositoryImpl(getEntityInformation(metadata.getDomainClass()), entityManager); } @Override protected Class<?> getRepositoryBaseClass(final RepositoryMetadata metadata) { return CommonRepository.class; } } }
Here is my custom repository implementation:Code:package be.leforem.nom.dao.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.NoRepositoryBean; import java.io.Serializable; @NoRepositoryBean public interface CommonRepository<T,ID extends Serializable> extends JpaRepository<T, ID> { void deleteAndFlush(T entity); }
And of course, I referenced the factory class to the jpa:repositories bean:Code:package be.leforem.nom.dao.repository; import org.springframework.data.jpa.repository.support.JpaEntityInformation; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.data.repository.NoRepositoryBean; import java.io.Serializable; import javax.persistence.EntityManager; @NoRepositoryBean public class CommonRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements CommonRepository<T, ID> { private final EntityManager entityManager; /** * Creates a new {@link SimpleJpaRepository} to manage objects of the given {@link JpaEntityInformation}. * * @param entityInformation * @param entityManager */ public CommonRepositoryImpl(final JpaEntityInformation<T, ?> entityInformation, final EntityManager entityManager) { super(entityInformation, entityManager); this.entityManager = entityManager; } /** * Creates a new {@link SimpleJpaRepository} to manage objects of the given domain type. * * @param domainClass * @param em */ public CommonRepositoryImpl(final Class<T> domainClass, final EntityManager em) { super(domainClass, em); entityManager = em; } @Override public void deleteAndFlush(final T entity) { delete(entity); flush(); } }
As I have to extends SimpleJpaRepository, I guess I have create the matching constructors.Code:<jpa:repositories base-package="be.leforem.nom.dao.repository" factory-class="be.leforem.nom.dao.repository.RepositoryFactoryBean" transaction-manager-ref="nom.transactionManager" entity-manager-factory-ref="nom.entityManager"/>
What's wrong with it ? Somebody can help me ?
Thanks ! :o)


Reply With Quote
. You return CommonRepository which is the interface, not the implementation class CommonRepositoryImpl. You might wanna have a look at the test cases [0] that implement a custom repository factory and try to find out how your scenario differs from yours.