我使用spring boot 1.2.5.RELEASE。 我定义了一个扩展CrudRepository
的接口public interface SampleEntityService extends CrudRepository<SampleEntity, Long> {...}
所以我的存储库将拥有所有方法,如:保存,删除等。 我想禁用一些方法,例如delete,因此它会抛出NotSupportedException(或其他)。
我首先想到它构建装饰器并覆盖所有这些方法并手动抛出异常。
这个问题有更好的解决方案吗?
答案 0 :(得分: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;
}
}
答案 1 :(得分: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