2016-12-13 7 views
0

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

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

@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 и бросить ODataExceptions, где вы хотите запретить операцию. Вы можете либо всегда генерировать исключения (т. Е. Полностью отключать тип операции), либо использовать информационные параметры URI для получения набора целевых сущностей и решать, следует ли вы бросать исключение или вызывать стандартный одиночный процессор. Я использовал этот подход для создания службы OData для чтения here (в основном, я только что создал ODAtaSingleProcessor, который делегирует некоторые вызовы на стандартный один + переопределенный метод на фабрике услуг, чтобы обернуть стандартный одиночный процессор в мою обертку).

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

Смежные вопросы