【问题标题】:OData (Olingo) "inhibit" endpointOData(Olingo)“禁止”端点
【发布时间】:2017-02-26 17:23:13
【问题描述】:

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

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

@Configuration
public class CxfServletUtil{

@Bean
public ServletRegistrationBean getODataServletRegistrationBean() {
    ServletRegistrationBean odataServletRegistrationBean = new ServletRegistrationBean(new CXFNonSpringJaxrsServlet(), "/user.svc/*");
    Map<String, String> initParameters = new HashMap<String, String>();
    initParameters.put("javax.ws.rs.Application", "org.apache.olingo.odata2.core.rest.app.ODataApplication");
    initParameters.put("org.apache.olingo.odata2.service.factory", "com.olingotest.core.CustomODataJPAServiceFactory");
    odataServletRegistrationBean.setInitParameters(initParameters);
    return odataServletRegistrationBean;
} ...

我的 ODataJPAServiceFactory 在哪里

@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);
    }
}

...

我的实体很简单...

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

@Basic
private String firstName;

@Basic
private String lastName;
....

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

我的问题是:我怎样才能“抑制”其中一些?例如,假设我不想启用删除我的实体。

我可以尝试使用过滤器 - 但这似乎有点苛刻。还有其他更好的方法来解决我的问题吗?

感谢您的帮助。

【问题讨论】:

    标签: spring spring-boot odata olingo


    【解决方案1】:

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

    您可以做两件事,具体取决于您想要实现的目标:

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2014-08-20
      • 2021-01-15
      • 2014-12-10
      • 2016-01-19
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多