CrudRepository OperationNotSupported

时间:2015-09-02 09:47:49

标签: java spring spring-boot spring-data

我使用spring boot 1.2.5.RELEASE。 我定义了一个扩展CrudRepository

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

所以我的存储库将拥有所有方法,如:保存,删除等。 我想禁用一些方法,例如delete,因此它会抛出NotSupportedException(或其他)。

我首先想到它构建装饰器并覆盖所有这些方法并手动抛出异常。

这个问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我认为你想要这个Jpa。

实现此目的的一种方法是使用自定义JpaRepositoryFactoryBeanRepositoryProxyPostProcessor添加到禁用某些方法的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