OData (Olingo) "inhibit" 端点

OData (Olingo) "inhibit" endpoint

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

我正在玩一个基于 Spring 启动并使用 Apache Olingo.On 的简单应用程序,简而言之,这是我的 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 操作的端点。

我的问题是:我怎样才能 "inhibit" 其中一些?比方说,我不想启用删除我的实体。

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

感谢您的帮助。

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

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

  1. 如果你想对允许或不允许的操作进行细粒度控制,你可以为 ODataSingleProcesor and throw ODataExceptions where you want to disallow an operation. You can either always throw exceptions (i.e. completely disabling an operation type) or you can use the URI info parameters to obtain the target entity set and decide if you should throw an exception or call the standard single processor. I have used this approach to create a read-only OData service here 创建一个包装器(基本上,我只是创建了一个 ODAtaSingleProcessor 委托一些调用标准处理器 + 重写服务工厂中的方法以将标准单处理器包装在我的包装器中)。

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