Spring Jpa adicionando funcionalidade customizada a todos os repositórios e ao mesmo tempo outras funções customizadas para um único repositório
Documentação de primavera aquihttp://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations dá exemplo para adicionar funcionalidades personalizadas para todos os repositórios ou para um único repositório, não ambos.
Vamos supor que eu queira adicionar alguns funcs personalizados a todos os repositórios (usando o Custom Repository Factory Bean) e outros apenas para um único repositório (docs diz para usar uma Custom Interface e um Custom Impl); como posso conseguir isso?
Algum exemplo de código onde eu adicionei o método "setCurrentTenansInSession" a todos os repositórios; agora quero adicionar um método personalizado, por exemplo "newCustomMethod", para um único repositório (que é um MyJpaRepository, como para minha fábrica de repositórios customizada). Como eu faço isso?
Interface de comportamento personalizado:
@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object);
}
Implementação de comportamento customizado:
public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object) {
//custom impl
}
}
Feijão de fábrica de repositório customizado:
public class MultiTenantJpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {
@Override
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new MultiTenantJpaRepositoryFactory(entityManager);
}
}
E finalmente a fábrica de repositórios personalizados:
public class MultiTenantJpaRepositoryFactory extends JpaRepositoryFactory {
public MultiTenantJpaRepositoryFactory(EntityManager entityManager) {
super(entityManager);
}
@Override
protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) {
final JpaEntityInformation<?, Serializable> entityInformation = getEntityInformation(metadata.getDomainType());
final SimpleJpaRepository<?, ?> repo = new MultiTenantSimpleJpaRepository(entityInformation, entityManager);
repo.setLockMetadataProvider(LockModeRepositoryPostProcessor.INSTANCE.getLockMetadataProvider());
return repo;
}
@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
return MultiTenantSimpleJpaRepository.class;
}
}