久々にBTPにDeployしていたCDSサービスを上げた時、↓のエラー
原因はHANA InstanceがStopped。
久々にBTPにDeployしていたCDSサービスを上げた時、↓のエラー
原因はHANA InstanceがStopped。
Valueをもって来るだけだとXmlSlurperが便利だが、
ノート追加とか属性を追加とか構造的に編集が必要だとXmlParserでやった方かいい。
っていうかXmlSlurperでは出来ない。
例は届いたXMLメッセージからSOAP headerを一旦きれいにして、新しいヘッダーを設定。
UUIDもランダムで作って付ける。その後Identificationというノードを追加して、
下にChild Nodeで設定した値を入れる。
後、Groovyのテストがめっちゃ面倒くさい。。IDEサポートをなんとかして欲しい。
公式ではAPIを提供しておらず、HTTPSで内部APIファイルを取ってくることを(非公式)推薦。。。
っていうかそれじゃないと出来ない。
(import com.sap.gateway.ip.core.customdev.processor.MessageImplが効かない)
https://blogs.sap.com/2019/01/03/exploring-cpis-filesystems-content/
ネットでIDE環境があるが、これ公式ではない!
https://groovyide.com/
こういうところが抜けてるんだよな。。。
import com.sap.gateway.ip.core.customdev.util.Message;
import com.sap.gateway.ip.core.customdev.util.SoapHeader;
import com.sap.it.api.mapping.*;
import java.util.HashMap;
import javax.xml.namespace.QName;
import groovy.xml.StreamingMarkupBuilder;
def Message processData(Message message) {
message.clearSoapHeaders();
def headers = new ArrayList();
def randomID = UUID.randomUUID().toString();
def xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><messageId xmlns=\"http://www.sap.com/webas/640/soap/features/messageId/\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">urn:uuid:$randomID</messageId>";
def header = new SoapHeader(new QName("http://www.sap.com/webas/640/soap/features/messageId/", "messageId"), xml, false, "");
headers.add(header);
message.setSoapHeaders(headers);
def messageLog = messageLogFactory.getMessageLog(message);
def body = message.getBody(java.lang.String);
def root = new XmlParser().parseText(body);
/* root.BusinessPartnerSUITEReplicateRequestMessage.MessageHeader.SenderBusinessSystemID[0].value = 'CPI_2';
root.BusinessPartnerSUITEReplicateRequestMessage.MessageHeader.RecipientBusinessSystemID[0].value = 'SD1_100';
root.MessageHeader.SenderBusinessSystemID[0].value = 'CPI_2';
root.MessageHeader.RecipientBusinessSystemID[0].value = 'SD1_100'; */
def ID = root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner[0].InternalID.text()
root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner[0].appendNode('Identification');
root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner.Identification[0].attributes()['actionCode']='04';
root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner.Identification[0].appendNode('PartyIdentifierTypeCode','CRM001');
root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner.Identification[0].appendNode('BusinessPartnerID', ID + '号');
outxml = groovy.xml.XmlUtil.serialize(root);
message.setBody(outxml);
messageLog.addAttachmentAsString("Payload post update:", outxml, "text/xml");
return message;
}
先ず
cf create-service hanatrial hdi-shared book-service-db-hdi-container
ここに二つダメなところがあった。
1. hanatrail
hanatrailではなく、hanaでする
hanaですると以下のようにエラー(もちろんBTP上でHANA instanceは作ってある前提)
元々hanatrailっていう別途プランがあったと覚えているが、消えた?
hanatrialはないと怒られて
hanaにするとOK
2. create-serviceの名前
これ例ではbook-service-db-hdi-containerになっているけどそのままにすると、instanceがないとエラーになる
なので、cf create-service hanatrial hdi-shared book-service-dbでhdi containerを作る。
作った後はデプロイ成功。
cds buildして、hdbcdsファイルが出ると失敗。これはHANA Cloudでは使えなく、
hdbview, hdbtableが使えるらしい。( from https://cap.cloud.sap/docs/guides/databases#hana-cloud)
hdbcdsでデプロイした場合、デプロイ自体は成功するが結局コンパイルエラーでCrashする。