Pitfall:
We strongly advise not to use OData v4 in conjunction with SAPUI5, as the SAPUI5 support for OData v4 is lackluster and leads to a number of problems in practice. OData v2 however is fully supported by SAPUI5.
Pitfall:
This will result in the Olingo artifacts being packaged into your EAR (and all further OData service EARs that you build). However, there is no other way to deploy Olingo-based JEE applications as Apache Olingo has a dependency on JPA2. Due to classloading mechanisms in SAP NetWeaver these can only be resolved correctly in a classloading chain that includes your application code, if the Olingo artifacts are bundled inside your EAR.
<filter>
<filter-name>ODataClassloaderFilter</filter-name>
<filter-class>com.yourpackage.web.ODataFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ODataClassloaderFilter</filter-name>
<url-pattern>/Data.svc/*</url-pattern>
<servlet-name>DataServlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>DataServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.apache.olingo.odata2.core.rest.app.ODataApplication</param-value>
</init-param>
<init-param>
<param-name>org.apache.olingo.odata2.service.factory</param-name>
<param-value>com.yourpackage.service.ODataServiceFactory</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DataServlet</servlet-name>
<url-pattern>/Data.svc/*</url-pattern>
</servlet-mapping>
public class ODataFilter extends Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setAttribute(ODataServiceFactory.FACTORY_CLASSLOADER_LABEL,
ODataServiceFactory.class.getClassLoader());
chain.doFilter(request, response);
}
}
public class ODataServiceFactory extends ODataJPAServiceFactory {
private static final String PERSISTENCE_UNIT_NAME = "pu-name";
private static final Location LOGGER = Location.getLocation(ODataServiceFactory.class);
private static final String USER_TRANSACTION_JNDI_NAME = "UserTransaction";
private EntityManagerService entityManagerService;
public ProcessODataServiceFactory() {
entityManagerService = ServiceLocator.getServiceInstance(EntityManagerService.class, EarDc.ODATA_EAR,
EjbDc.ODATA_EJB);
}
protected EntityManager getEntityManager() {
return entityManagerService.getProcessEntityManager();
}
protected String getPersistenceUnitName() {
return PERSISTENCE_UNIT_NAME;
}
@Override
public ODataJPAContext initializeODataJPAContext() throws ODataJPARuntimeException {
InitialContext initialContext;
try {
initialContext = new InitialContext();
ODataJPAContext oDataJPAContext = getODataJPAContext();
oDataJPAContext.setEntityManager(getEntityManager());
oDataJPAContext.setPersistenceUnitName(getPersistenceUnitName());
oDataJPAContext.setContainerManaged(true);
oDataJPAContext.getODataContext().setDebugMode(true);
final UserTransaction userTransaction = (UserTransaction) initialContext.lookup(USER_TRANSACTION_JNDI_NAME);
setODataJPATransaction(new ODataJPATransaction() {
@Override
public void rollback() {
try {
userTransaction.rollback();
} catch (IllegalStateException | SecurityException | SystemException e) {
LOGGER.errorT("Problem with rollback: " + ExceptionUtils.getStackTrace(e));
throw new OdataJpaException("Error during rollback.");
}
}
@Override
public boolean isActive() {
try {
return userTransaction.getStatus() == Status.STATUS_ACTIVE;
} catch (SystemException e) {
LOGGER.errorT("Problem with isActive: " + ExceptionUtils.getStackTrace(e));
return false;
}
}
@Override
public void commit() {
try {
userTransaction.commit();
} catch (SecurityException | IllegalStateException | RollbackException | HeuristicMixedException
| HeuristicRollbackException | SystemException e) {
LOGGER.errorT("Problem with commit: " + ExceptionUtils.getStackTrace(e));
throw new OdataJpaException("Error during commit.");
}
}
@Override
public void begin() {
try {
userTransaction.begin();
} catch (NotSupportedException | SystemException e) {
LOGGER.errorT("Problem with begin: " + ExceptionUtils.getStackTrace(e));
throw new OdataJpaException("Error beginning transaction.");
}
}
});
return oDataJPAContext;
} catch (NamingException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.ENTITY_MANAGER_NOT_INITIALIZED, e);
}
}
@SuppressWarnings("unchecked")
@Override
public <T extends ODataCallback> T getCallback(Class<T> callbackInterface) {
if (callbackInterface.isAssignableFrom(ODataErrorCallback.class)) {
return (T) new CustomErrorCallback();
}
T callback = super.getCallback(callbackInterface);
return callback;
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
8 | |
5 | |
5 | |
4 | |
4 | |
4 | |
4 | |
3 | |
3 | |
3 |