(si 2.11是特定的,spring 3.1.1)getStandardRequestHeaderNames可以被覆盖以在si消息头中包含附加应用程序特定对象。我们的应用程序依赖于这种能力(可能是错误的)来覆盖这种方法,并提供一个自定义的POJO,由许多分离器,聚合器等组成,由下游组成。该应用程序使用ws入站网关并使用header-mapper属性来指定自定义肥皂头映射器。弹簧整合DefaultSoapHeaderMapper - getStandardRequestHeaderNames - 覆盖以前si版本中的
为什么getStandardRequestHeaderNames无法被覆盖的背后推理的任何线索?
需要一些建议,我可以如何迁移到当前的春季版本。 要求是从soapHeader中提取元素,并将它们映射到SI消息头中作为POJO并将其发送到下游。 所有帮助表示赞赏。
代码片段:与旧版本春天
<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的知识非常有限,请原谅无知。我可以很容易地从传入的soap消息头中提取感兴趣的元素。 extractuserDefinedHeaders返回包含新元素的Map。我找不到在SoapHeaderMapper中访问SI消息的方法。我甚至尝试过实现多个接口的自定义SoapheaderMapper,包括普通的headerMapper。 –
你不需要担心这个级别的消息。所有userDefinedHeaders将移动到消息标题。你不需要做那个标准的头文件。 –
请参阅requestHeaderNames选项 –