2016-05-13 14 views
1

以前の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; 
    } 
} 

答えて

0

シェア、してください、あなたはそれを見たい方法をいくつかのコードで動作します。

多分あなた自身のSoapHeaderMapperを実装して、それをWS Inbound Gatewayに注入できますか?

ロジックを再利用して、DefaultSoapHeaderMapperの標準動作をコピー/ペーストできます。

UPDATE

テストケースを手動ユーザ定義のヘッダを追加する方法を実証する:

@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")); 
} 
+0

おかげで応答します。私は本当にそれを感謝します。間違いなく、最低限のコードを公開して問題を明白にしてくれるでしょう。私はSI知識が非常に限られているので、無知を許してください。入ってくる石鹸メッセージのヘッダーから目的の要素を簡単に抽出できます。 extractuserDefinedHeadersは新しい要素を含むMap を返します。私はSoapHeaderMapperでSIメッセージにアクセスする方法を理解できませんでした。私は、普通のheaderMapperを含む複数のインターフェースを実装する同じカスタムSoapheaderMapperを試みました。 –

+0

このレベルのメッセージについて心配する必要はありません。すべてのuserDefinedHeadersがメッセージヘッダーに移動します。あなたはその標準のヘッダーをハックする必要はありません。 –

+0

requestHeaderNamesオプションを参照してください –

関連する問題