【问题标题】:CrudRepository OperationNotSupportedCrudRepository 操作不支持
【发布时间】:2015-11-27 18:26:10
【问题描述】:

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

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

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

我的第一个想法是构建装饰器并覆盖所有这些方法并手动抛出异常。

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

【问题讨论】:

    标签: java spring spring-boot spring-data


    【解决方案1】:

    我假设你想要这个给 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

      【讨论】:

      • 我同意这个解决方案如果对你有用的话会干净得多。
      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多