2016-05-13 73 views
1

(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; 
    } 
} 

回答

0

分享作品,请一些代码,你会如何想看到这一点。

也许你可以实现自己的SoapHeaderMapper并将它注入WS入站网关?

您仍然可以重复使用您的逻辑并复制/粘贴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的知识非常有限,请原谅无知。我可以很容易地从传入的soap消息头中提取感兴趣的元素。 extractuserDefinedHeaders返回包含新元素的Map 。我找不到在SoapHeaderMapper中访问SI消息的方法。我甚至尝试过实现多个接口的自定义SoapheaderMapper,包括普通的headerMapper。 –

+0

你不需要担心这个级别的消息。所有userDefinedHeaders将移动到消息标题。你不需要做那个标准的头文件。 –

+0

请参阅requestHeaderNames选项 –