2015-09-02 18 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