OData (Olingo) "запрещает" конечную точку

Мой вопрос о том, каков наилучший способ запретить конечную точку, которая автоматически предоставляется Olingo?

Я играю с простым приложением, основанным на загрузке Spring, и использую Apache Olingo. Короче, это моя регистрация сервлета:

@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 для моей сущности.

У меня вопрос: как я могу "подавить" некоторые из них? Скажем, например, что я не хочу разрешать удаление моей сущности.

Я мог бы попытаться использовать Фильтр - но это кажется немного резким. Есть ли другие, лучшие способы решить мою проблему?

Спасибо за помощь.

1 ответ

Решение

Как вы уже сказали, вы можете использовать фильтр, но тогда вы действительно связаны со схемой URI, используемой Olingo. Кроме того, все усложняется, когда у вас есть несколько связанных наборов сущностей (потому что вы можете переходить от одного к другому, делая URI более сложными).

Есть две вещи, которые вы можете сделать, в зависимости от того, чего вы хотите достичь:

  1. Если вы хотите иметь детализированный контроль над тем, какие операции разрешены или нет, вы можете создать оболочку для ODataSingleProcesor и выдавать исключения ODataException, где вы хотите запретить операцию. Вы можете либо всегда генерировать исключения (то есть полностью отключать тип операции), либо использовать информационные параметры URI для получения набора целевых объектов и принятия решения, следует ли генерировать исключение или вызывать стандартный одиночный процессор. Я использовал этот подход для создания службы OData только для чтения (в основном я только что создал ODAtaSingleProcessor, который делегирует некоторые вызовы стандартному one + переопределяет метод в фабрике сервисов, чтобы обернуть стандартный одиночный процессор в мою оболочку).

  2. Если вы хотите полностью раскрыть / игнорировать данную сущность или некоторые свойства, то вы можете использовать конец модели отображения JPA-EDM, исключив нужные компоненты. Вы можете найти пример такого сопоставления здесь: github. Модель отображения - это просто файл XML, который отображает сущности / свойства JPA на тип / свойства сущности EDM. Чтобы olingo мог его забрать, вы можете передать имя файла методу setJPAEdmMappingModel ODataJPAContext в вашем методе initialize.

Другие вопросы по тегам