以前のsiバージョン(si 2.11と春3.1.1)getStandardRequestHeaderNamesは、追加のアプリケーション固有のオブジェクトをsiメッセージヘッダーに含めることができます。私たちのアプリケーションは、このメソッドをオーバーライドし、カスタムPOJOを多くのスプリッタ、アグリゲータなどからなる下流に運ぶためにこの機能に頼っていました(アプリケーションがWsインバウンドゲートウェイを使用し、header-mapper属性を使用してカスタムソープヘッダーマッパー。SpringインテグレーションDefaultSoapHeaderMapper - getStandardRequestHeaderNames - オーバーライド
なぜgetStandardRequestHeaderNamesを上書きできないのかについての手掛かりはありますか?
これを現在の春リリースにどのように移行できるかについてのアドバイスが必要です。 必要条件は、soapHeaderから要素を抽出し、それをPOJOとしてSIメッセージヘッダーにマップし、ダウンストリームに送信することです。 すべての助力に感謝します。
コードスニペットは:春の古いバージョン
<int-ws:inbound-gateway id="webservice-inbound-gateway"
request-channel="input-request-channel"
reply-channel="output-response-channel"
header-mapper="CustomSoapHeaderMapper"
marshaller="marshaller"
unmarshaller="marshaller" />
@Component("CustomSoapHeaderMapper")
public class CustomSoapHeaderMapper extends DefaultSoapHeaderMapper {
private static final Logger logger = Logger.getLogger("CustomSoapHeaderMapper");
public static final String HEADER_SEARCH_METADATA = SearchMetadata.HEADER_ATTRIBUTE_NAME;
public static final String HEADER_SERVICE_AUDIT = "XXXXXXXX";
// Use simulation if security token is set to this value
public static final String SECURITY_TOKEN_SIMULATION = "XXXX";
private static final List<String> CUSTOM_HEADER_NAMES = new ArrayList<String>();
static {
CUSTOM_HEADER_NAMES.add(WebServiceHeaders.SOAP_ACTION);
CUSTOM_HEADER_NAMES.add(HEADER_SEARCH_METADATA);
}
private int version =SearchMetadata.VERSION_CURRENT;
public void setVersion(int version) {
this.version = version;
}
@Override
protected List<String> getStandardRequestHeaderNames() {
return CUSTOM_HEADER_NAMES;
}
@Override
protected Map<String, Object> extractUserDefinedHeaders(SoapMessage source) {
// logger.log(Level.INFO,"extractUserDefinedHeaders");
// call base class to extract header
Map<String, Object> map = super.extractUserDefinedHeaders(source);
Document doc = source.getDocument();
SearchMetadata searchMetadata = new SearchMetadata();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
source.writeTo(baos);
baos.flush();
searchMetadata.setRequestXML(baos.toString());
baos.close();
} catch (IOException e1) {
}
//logger.log(Level.WARNING, "Incoming Message " + baos.toString());
SOAPMessage soapMessage = ((SaajSoapMessage) source).getSaajMessage();
// generate TransactionID with UUID value
String transactionID = UUID.randomUUID().toString();
// logger.log(Level.WARNING, "TransactionID=" + transactionID);
Date now = new Date();
searchMetadata.setTransactionID(transactionID);
searchMetadata.setRequestType(SearchMetadata.REQUEST_TYPE_SYNCHRONOUS);
searchMetadata.setRequestTime(now);// initialize the request time
searchMetadata.setReceivedTime(now);// mark time system receives request
searchMetadata.setVersion(version);
Map<String, Object> finalHeaders = new HashMap<String, Object>();
finalHeaders.put(HEADER_SEARCH_METADATA, searchMetadata);
if (!CollectionUtils.isEmpty(map)) {
// copy from other map
finalHeaders.putAll(map);
// check if ServiceAudit is available
SoapHeaderElement serviceAuditElement = null;
for (String key : map.keySet()) {
// logger.log(Level.WARNING, "SoapHeader.{0}", key);
if (StringUtils.contains(key, HEADER_SERVICE_AUDIT)) {
serviceAuditElement = (SoapHeaderElement) map.get(key);
break;
}
}
}
return finalHeaders;
}
// GK Key Thing here for performance improvement is avoiding marshalling
public gov.dhs.ice.ess.schema.ServiceAudit ExtractAuditHeader(Document doc) {
....
}
return serviceAudit;
}
}
おかげで応答します。私は本当にそれを感謝します。間違いなく、最低限のコードを公開して問題を明白にしてくれるでしょう。私はSI知識が非常に限られているので、無知を許してください。入ってくる石鹸メッセージのヘッダーから目的の要素を簡単に抽出できます。 extractuserDefinedHeadersは新しい要素を含むMapを返します。私はSoapHeaderMapperでSIメッセージにアクセスする方法を理解できませんでした。私は、普通のheaderMapperを含む複数のインターフェースを実装する同じカスタムSoapheaderMapperを試みました。 –
このレベルのメッセージについて心配する必要はありません。すべてのuserDefinedHeadersがメッセージヘッダーに移動します。あなたはその標準のヘッダーをハックする必要はありません。 –
requestHeaderNamesオプションを参照してください –