We are going to gather some statics in SAP BTP Neo environment with FRun (not support CF). To implement the tracing of outgoing connections calls. I need to update "SAP-PASSPORT" and forward it as a header.
I followed SAP official documentation to implement it. https://help.sap.com/viewer/ea72206b834e4ace9cd834feed6c0e09/Cloud/en-US/05a07108d34540d39b8a79e2caf96c8c.html
From my perspective, Step 2 could be skipped. The only thing I need to do is to get updated SAP Passport Header and set it to request header.
Sample code:
1.Implement ConnectionInfo interface
public class ConnectionInfoNeo implements ConnectionInfo {
@Override
public byte[] getId() {
UUID uuid = java.util.UUID.randomUUID();
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
}
@Override
public int getCounter() {
return 1;
}
}
Get SapPassportHeader and set it to request header
public class MyPurchaseOrderService { private static final Logger logger = LoggerFactory.getLogger(MyPurchaseOrderService.class); private static final ConnectionInfo CONNECTION_INFO = new ConnectionInfoNeo(); public List<String> getPurchaseOrdersValueHelp(String purOrderStr) throws NamingException { String destinationName = "ErpQueryEndpoint"; Context ctx = new InitialContext(); logger.info("Context: " + ctx); // ConnectivityConfiguration configuration = (ConnectivityConfiguration) ctx.lookup("java:comp/env/connectivityConfiguration"); // DestinationConfiguration destConfiguration = configuration.getConfiguration(destinationName); // String destinationUrl = destConfiguration.getProperty("URL");
SapPassportHeader sapPassportHeader = updateSapPassportHeader(ctx);
HttpDestination destination = DestinationAccessor.getDestination(destinationName).asHttp(); List<PurchaseOrder> purchaseOrders = new DefaultPurchaseOrderService() .getAllPurchaseOrder() .withHeader("SAP-PASSPORT", sapPassportHeader.getValue()) .filter(PurchaseOrder.PURCHASE_ORDER.startsWith(purOrderStr)) //.top(20) .executeRequest(destination); List<String> purOrderNumList = new ArrayList<>(); purchaseOrders.forEach(purchaseOrder -> { purOrderNumList.add(purchaseOrder.getPurchaseOrder()); }); return purOrderNumList; } private SapPassportHeader updateSapPassportHeader(Context ctx) throws NamingException { SapPassportHeaderProvider sapPassportHeaderProvider = (SapPassportHeaderProvider) ctx.lookup("java:comp/env/SapPassportHeaderProvider"); return sapPassportHeaderProvider.getSapPassportHeader(CONNECTION_INFO); } }
But when I tested in Neo environment, I got an exception.
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na#javax.naming.NameNotFoundException: Name [SapPassportHeaderProvider] is not bound in this Context. Unable to find [SapPassportHeaderProvider]. |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:824) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:157) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:834) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:157) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:834) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:171) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.SelectorContext.lookup(SelectorContext.java:161) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5
#na#na#na#na# at javax.naming.InitialContext.lookup(InitialContext.java:417) |
How to register SapPassportHeaderProvider in JNDI? Is there any simple way to get the header in Cloud SDK Neo for Java7 project?
================================================================
I added some resource configuration in web.xml. The above issue is resolved. But SAP passport header is always null.
<resource-ref>
<res-ref-name>connectivityConfiguration</res-ref-name>
<res-type>com.sap.core.connectivity.api.configuration.ConnectivityConfiguration</res-type>
</resource-ref>
<resource-ref>
<res-ref-name>SapPassportHeaderProvider</res-ref-name>
<res-type>com.sap.core.connectivity.api.sappassport.SapPassportHeaderProvider</res-type>
</resource-ref>
2021 11 04 04:14:58#+00#ERROR#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/PurchaseOrderNeo-application].[com.bosch.sbs.po.servet.PurchaseOrderValueHelpServlet]##ZJE8SZH#https-jsse-nio-8041-exec-7#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na#Servlet.service() for servlet [com.bosch.sbs.po.servet.PurchaseOrderValueHelpServlet] in context with path [/PurchaseOrderNeo-application] threw exception com.sap.cloud.sdk.cloudplatform.exception.ShouldNotHappenException: com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException: java.lang.NullPointerException: while trying to invoke the method com.sap.core.connectivity.api.sappassport.SapPassportHeader.getValue() of a null object loaded from local variable 'sapPassportHeader'
=========================================================================