Spring integration Spring集成DefaultSoapHeaderMapper-getStandardRequestHeaderNames-override
在以前的si版本(具体为si 2.11和spring 3.1.1)中,可以覆盖getStandardRequestHeaderNames,以便在si消息头中包含其他特定于应用程序的对象。我们的应用程序依赖于这种能力(可能是错误的)来覆盖此方法,并提供一个自定义POJO,该POJO将由多个拆分器、聚合器等组成,并传送到下游。该应用程序使用ws-inbound gateway并使用header mapper属性来指定自定义soap header mapper 关于为什么getStandardRequestHeaderNames不能被覆盖的原因,有什么线索吗 需要一些关于如何将此迁移到当前spring版本的建议。 需求是从soapHeader中提取元素,并将它们作为POJO映射到SI消息头,然后将其发送到下游。 谢谢你的帮助 代码片段:适用于较旧版本的springSpring integration Spring集成DefaultSoapHeaderMapper-getStandardRequestHeaderNames-override,spring-integration,Spring Integration,在以前的si版本(具体为si 2.11和spring 3.1.1)中,可以覆盖getStandardRequestHeaderNames,以便在si消息头中包含其他特定于应用程序的对象。我们的应用程序依赖于这种能力(可能是错误的)来覆盖此方法,并提供一个自定义POJO,该POJO将由多个拆分器、聚合器等组成,并传送到下游。该应用程序使用ws-inbound gateway并使用header mapper属性来指定自定义soap header mapper 关于为什么getStandardRequ
<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;
}
}
@组件(“CustomSoapHeaderMapper”)
公共类CustomSoapHeaderMapper扩展了DefaultSoapHeaderMapper{
私有静态最终记录器Logger=Logger.getLogger(“CustomSoapHeaderMapper”);
public static final String HEADER\u SEARCH\u METADATA=SearchMetadata.HEADER\u ATTRIBUTE\u NAME;
公共静态最终字符串头\u服务\u审计=“XXXXXXXX”;
//如果安全令牌设置为此值,则使用模拟
公共静态最终字符串安全性\u令牌\u模拟=“XXXX”;
private static final List CUSTOM_HEADER_NAMES=new ArrayList();
静止的{
自定义\u头\u名称.add(WebServiceHeaders.SOAP\u操作);
自定义标题名称。添加(标题搜索元数据);
}
private int version=SearchMetadata.version\u当前;
公共无效设置版本(int版本){
this.version=版本;
}
@凌驾
受保护列表getStandardRequestHeaderNames(){
返回自定义_头_名称;
}
@凌驾
受保护的映射extractUserDefinedHeaders(SoapMessage源){
//logger.log(Level.INFO,“extractUserDefinedHeaders”);
//调用基类以提取标头
Map Map=super.extractUserDefinedHeaders(源);
Document doc=source.getDocument();
SearchMetadata SearchMetadata=新的SearchMetadata();
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
试一试{
资料来源:书面形式(BAS);
paos.flush();
setRequestXML(baos.toString());
baos.close();
}捕获(IOE1异常){
}
//logger.log(Level.WARNING,“传入消息”+baos.toString());
SOAPMessage SOAPMessage=((SaajSoapMessage)源);
//使用UUID值生成TransactionID
字符串transactionID=UUID.randomUUID().toString();
//logger.log(Level.WARNING,“TransactionID=“+TransactionID”);
现在日期=新日期();
searchMetadata.setTransactionID(transactionID);
searchMetadata.setRequestType(searchMetadata.REQUEST\u TYPE\u同步);
searchMetadata.setRequestTime(现在);//初始化请求时间
searchMetadata.setReceivedTime(现在);//标记系统接收请求的时间
searchMetadata.setVersion(版本);
Map finalHeaders=newhashmap();
finalHeaders.put(标题\搜索\元数据,搜索元数据);
如果(!CollectionUtils.isEmpty(map)){
//从其他地图复制
最终领导人。普塔尔(地图);
//检查ServiceAudit是否可用
SoapHeaderElement serviceAuditElement=null;
for(字符串键:map.keySet()){
//logger.log(Level.WARNING,“SoapHeader.{0}”,键);
if(StringUtils.contains(键、头\服务\审计)){
serviceAuditElement=(SoapHeaderElement)map.get(键);
打破
}
}
}
返回最终领导人;
}
//GK性能改进的关键是避免编组
public gov.dhs.ice.ess.schema.ServiceAudit ExtractAuditHeader(文档文档){
....
}
返回服务审计;
}
}
请分享一些代码,你希望看到什么
也许您可以实现自己的SoapHeaderMapper
并将其注入WS-Inbound网关
您仍然可以重用逻辑并从DefaultSoapHeaderMapper
复制/粘贴标准行为
更新
演示如何手动添加用户定义标题的测试用例:
@Test
public void testCustomSoapHeaderMapper() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper() {
@Override
protected Map<String, Object> extractUserDefinedHeaders(SoapMessage source) {
Map<String, Object> headers = super.extractUserDefinedHeaders(source);
headers.put("foo", "bar");
return headers;
}
};
mapper.setRequestHeaderNames("*");
SoapMessage soapMessage = mock(SoapMessage.class);
Map<String, Object> headers = mapper.toHeadersFromRequest(soapMessage);
assertTrue(headers.containsKey("foo"));
assertEquals("bar", headers.get("foo"));
}
@测试
public void testCustomSoapHeaderMapper(){
DefaultSoapHeaderMapper=新的DefaultSoapHeaderMapper(){
@凌驾
受保护的映射extractUserDefinedHeaders(SoapMessage源){
映射头=super.extractUserDefinedHeaders(源);
标题。放置(“foo”、“bar”);
返回标题;
}
};
mapper.setRequestHeaderNames(“*”);
SoapMessage SoapMessage=mock(SoapMessage.class);
Map headers=mapper.toHeadersFromRequest(soapMessage);
资产真实(headers.containsKey(“foo”);
assertEquals(“bar”,headers.get(“foo”);
}
请分享一些代码,你希望看到什么
也许您可以实现自己的SoapHeaderMapper
并将其注入WS-Inbound网关
您仍然可以重用逻辑并从DefaultSoapHeaderMapper
复制/粘贴标准行为
更新
演示如何手动添加用户定义标题的测试用例:
@Test
public void testCustomSoapHeaderMapper() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper() {
@Override
protected Map<String, Object> extractUserDefinedHeaders(SoapMessage source) {
Map<String, Object> headers = super.extractUserDefinedHeaders(source);
headers.put("foo", "bar");
return headers;
}
};
mapper.setRequestHeaderNames("*");
SoapMessage soapMessage = mock(SoapMessage.class);
Map<String, Object> headers = mapper.toHeadersFromRequest(soapMessage);
assertTrue(headers.containsKey("foo"));
assertEquals("bar", headers.get("foo"));
}
@测试
public void testCustomSoapHeaderMapper(){
DefaultSoapHeaderMapper=新的DefaultSoapHeaderMapper(){
@凌驾
受保护的映射extractUserDefinedHeaders(SoapMessage源){
映射头=super.extractUserDefinedHeaders(源);
标题。放置(“foo”、“bar”);
返回标题;
}
};
mapper.setRequestHeade