Spring integration Spring集成DefaultSoapHeaderMapper-getStandardRequestHeaderNames-override

Spring 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

在以前的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消息头,然后将其发送到下游。 谢谢你的帮助

代码片段:适用于较旧版本的spring

<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