2015-09-02 64 views
1

我使用spring boot 1.2.5.RELEASE。 我定義的擴展CrudRepositoryCrudRepository OperationNotSupported

public interface SampleEntityService extends CrudRepository<SampleEntity, Long> {...} 

所以我的版本庫會像所有方法的接口:保存,刪除等 我想禁用一些方法,例如刪除,所以它會拋出NotSupportedException異常(或其他)。

我的第一個想法是構建裝飾器並覆蓋所有這些方法並手動拋出異常。

這個問題有更好的解決方案嗎?

回答

2

我想你想要這個Jpa。

實現此目的的一種方法是使用自定義JpaRepositoryFactoryBean,將RepositoryProxyPostProcessor添加到JpaRepositoryFactory,禁用某些方法。

例如:

@Configuration 
@EnableJpaRepositories(repositoryFactoryBeanClass = CustomJpaRepositoryFactoryBean.class) 
public class MyConfig { 

} 

然後像

public class CustomJpaRepositoryFactoryBean extends JpaRepositoryFactoryBean { 

    @Override 
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) { 
     JpaRepositoryFactory factory = JpaRepositoryFactory(entityManager); 
     factory.addRepositoryProxyPostProcessor(new RepositoryProxyPostProcessor() { 

      @Override 
      public void postProcess(ProxyFactory factory, RepositoryInformation repositoryInformation) { 
       factory.addAdvice(new MethodInterceptor() { 

        @Override 
        public Object invoke(MethodInvocation invocation) throws Throwable { 
         if ("unsupportedMethod".equals(invocation.getMethod().getName())) { 
          throw new UnsupportedOperationException(); 
         } 
         return invocation.proceed(); 
        } 
       }); 
      } 
     }); 
     return factory; 
    } 
} 
2

雖然你問肯定是可行的(從@tsachev的解決方案是完全合法的),清潔的解決方案是定義您自己的自定義存儲庫,該存儲庫只包含您要實施的方法。

例如,你可以寫:

@NoRepositoryBean 
interface SuperSimpleRepository<T, ID extends Serializable> extends Repository<T, ID> { 

    T findOne(ID id); 

    T save(T entity); 
} 

interface SampleEntityRepository extends SuperSimpleRepository<SampleEntity, Long> { 

} 

退房的相關文件here

+1

我同意這個解決方案是,如果你的作品乾淨多了。 – tsachev

+0

我已經嘗試過,它完全工作。 – geoand