我的JPA存储库扩展了一个自定义接口,该接口带有用于以通用方式处理授权的注释。
public interface MultiTenantCrudRepo<T, ID> extends CrudRepository<T, ID>
此接口将@ PreAuthorize,@ PostAuthorize,@ PreFilter和@PostFilter注释添加到CrudRepository的方法中。
此外,对于某些实体,我需要实现软删除。为此,我创建了一个像这样的“ SoftDeleteRepository”:
public interface SoftDeleteRepository<T extends BaseEntity<I> & SoftDeletable, I extends Serializable> extends CrudRepository<T, I> {
@Query("update #{#entityName} e set e.isDeleted = true where e.id = ?#{#entity.id}")
@Modifying
@Override
public void delete(@Param("entity") T entity);
您可以看到它添加了@Query注释以实现我需要的功能。
两个接口都能按预期独立工作,但是当存储库需要这样的两个属性(授权和软删除)时
public interface FooRepo extends SoftDeleteRepository<Foo, Long>, MultiTenantCrudRepo<Foo, Long> {
似乎只有“扩展”之后的第一个接口的注释才有效。因此,在这种情况下,我得到了一个支持软偏转但没有授权验证的FooRepo。
使两者同时工作的最佳方法是什么?
答案 0 :(得分:1)
猜测这是一件棘手的事情,因为它实际上是Java不支持的多继承事物,例如,参见this。
例如,如果两个相同的注释具有不同的参数,将会选择什么?
许多框架(如Spring数据)在检查注释的继承时都可以很好地工作,但是仅当没有多重继承和/或具有相同的注释时才进行猜测。这些框架可能使用反射来进入“实现树”,但由于上述原因或者如果实施得当会引发异常,它们可能只会选择一条路径。
因此,恐怕您需要执行以下操作:
ax.set(xticks=range(len(jobs)), xticklabels=[i[0] for i in jobs])