Oleg, thanks for helping me!
I have filed a jira improvement request INT-2073 (which can be found here).
The solution was indeed to replace the outbound-channel-adapter
Code:
<xmpp:outbound-channel-adapter channel="xmppOutbound" xmpp-connection="xmppConnection"/>
with following declaration:
Code:
<integration:service-activator input-channel="xmppOutbound" ref="chatMessageWithCustomHeadersSendingMessageHandler">
<constructor-arg ref="xmppConnection"/>
</integration:service-activator>
and to create the following class (which is allmost a literal copy of ChatMessageSendingMessageHandler):
Code:
@Component
public class ChatMessageWithCustomHeadersSendingMessageHandler extends AbstractXmppConnectionAwareMessageHandler {
public ChatMessageWithCustomHeadersSendingMessageHandler() {
super();
}
public ChatMessageWithCustomHeadersSendingMessageHandler(XMPPConnection xmppConnection) {
super(xmppConnection);
}
@Override
@ServiceActivator
protected void handleMessageInternal(Message<?> message) throws Exception {
Assert.isTrue( this.initialized, this.getComponentName() + "#" + this.getComponentType() + " must be initialized" );
Object messageBody = message.getPayload();
org.jivesoftware.smack.packet.Message xmppMessage = null;
if (messageBody instanceof org.jivesoftware.smack.packet.Message) {
xmppMessage = (org.jivesoftware.smack.packet.Message) messageBody;
}
else if (messageBody instanceof String) {
String chatTo = message.getHeaders().get( XmppHeaders.CHAT_TO, String.class);
Assert.state( StringUtils.hasText( chatTo ), "The '" + XmppHeaders.CHAT_TO + "' header must not be null");
xmppMessage = new org.jivesoftware.smack.packet.Message(chatTo);
String threadId = message.getHeaders().get(XmppHeaders.CHAT_THREAD_ID, String.class);
if (StringUtils.hasText(threadId)) {
xmppMessage.setThread(threadId);
}
Iterator<String> headerKeysIterator = message.getHeaders().keySet().iterator();
while(headerKeysIterator.hasNext()) {
String headerKey = headerKeysIterator.next();
if(!headerKey.equalsIgnoreCase( XmppHeaders.CHAT_TO ) &&
!headerKey.equalsIgnoreCase( XmppHeaders.CHAT_THREAD_ID )) {
xmppMessage.setProperty( headerKey , message.getHeaders().get( headerKey ) );
}
}
xmppMessage.setBody((String) messageBody);
}
else {
throw new MessageHandlingException(message, "Only payloads of type java.lang.String or org.jivesoftware.smack.packet.Message " +
"are supported. Received [" + messageBody.getClass().getName() +
"]. Consider adding a Transformer prior to this adapter.");
}
if (!this.xmppConnection.isConnected()) {
this.xmppConnection.connect();
}
this.xmppConnection.sendPacket(xmppMessage);
}
}
Note: Bear in mind that this is a (too) simple solution, it might copy more headers than desired because it copies them all!