/** * Return a mutable {@code MessageHeaderAccessor} for the given message attempting to match the * type of accessor used to create the message headers, or otherwise wrapping the message with a * {@code MessageHeaderAccessor} instance. * * <p>This is for cases where a header needs to be updated in generic code while preserving the * accessor type for downstream processing. * * @return an accessor of the required type (never {@code null}) * @since 4.1 */ public static MessageHeaderAccessor getMutableAccessor(Message<?> message) { if (message.getHeaders() instanceof MutableMessageHeaders) { MutableMessageHeaders mutableHeaders = (MutableMessageHeaders) message.getHeaders(); MessageHeaderAccessor accessor = mutableHeaders.getMessageHeaderAccessor(); if (accessor != null) { return (accessor.isMutable() ? accessor : accessor.createAccessor(message)); } } return new MessageHeaderAccessor(message); }