OData(Olingo)“抑制”终点

时间:2016-12-13 07:51:33

标签: spring spring-boot odata olingo

我的问题是什么是抑制Olingo自动提供的端点的最佳方法?

我正在玩一个基于Spring启动和使用Apache Olingo的简单应用程序。简而言之,这是我的servlet注册:

@Component
public class CustomODataJPAServiceFactory extends ODataJPAServiceFactory implements ApplicationContextAware {

private static ApplicationContext context;

private static final String PERSISTENCE_UNIT_NAME = "myPersistenceUnit";
private static final String ENTITY_MANAGER_FACTORY_ID = "entityManagerFactory";

@Override
public ODataJPAContext initializeODataJPAContext()
        throws ODataJPARuntimeException {
    ODataJPAContext oDataJPAContext = this.getODataJPAContext();
    try {
        EntityManagerFactory emf = (EntityManagerFactory) context.getBean(ENTITY_MANAGER_FACTORY_ID);
        oDataJPAContext.setEntityManagerFactory(emf);
        oDataJPAContext.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
        return oDataJPAContext;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

...

我的ODataJPAServiceFactory是

@Entity
public class User {
@Id
private String id;

@Basic
private String firstName;

@Basic
private String lastName;
....

我的实体非常简单......

/tcv:Version35

Olingo完美地完成了它的工作,它帮助我为我的实体生成围绕CRUD操作的所有端点。

我的问题是:如何“抑制”其中一些?比方说,我不想启用删除我的实体。

我可以尝试使用过滤器 - 但这看起来有点刺耳。还有其他更好的方法来解决我的问题吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

正如您所说,您可以使用过滤器,但是您真的与Olingo使用的URI模式相结合。此外,当您拥有多个相关的实体集时,事情会变得复杂(因为您可以从一个实体集导航到另一个,从而使URI更复杂)。

根据您想要达到的目标,您可以做两件事:

  1. 如果您希望对允许或不允许的操作进行精细控制,可以为ODataSingleProcesor创建一个包装器,并将ODataExceptions抛出到您想要禁止操作的位置。您可以始终抛出异常(即完全禁用操作类型),也可以使用URI info参数获取目标实体集,并决定是应抛出异常还是调用标准单处理器。我用这种方法创建了一个只读的OData服务here(基本上,我刚刚创建了一个ODAtaSingleProcessor,它将一些调用委托给标准的一个+覆盖服务工厂中的一个方法,将标准的单个处理器包装在我的包装器)。

  2. 如果要完全取消暴露/忽略给定的实体或某些属性,则可以使用JPA-EDM映射模型结束排除所需的组件。您可以在此处找到此类映射的示例:github。映射模型只是一个XML文件,它将JPA实体/属性映射到EDM实体类型/属性。为了让olingo获取它,您可以将文件名传递给初始化方法中ODataJPAContext的setJPAEdmMappingModel方法。