nebula
nebula

Reputation: 3982

Set File name in Message header in Spring Integration

I want to set the file name in the header of the Message. So I placed the header enricher:

<int:header-enricher input-channel="singleFile" output-channel="fileNameAddedToHeader">
         <int:header name="file-name" ref="fileNameHeaderEnricher" method="enrichHeader"/>
</int:header-enricher>

The enricher method is:

public Message<File> enrichHeader(Message<File> fileMessage) {
    File file = (File) fileMessage.getPayload();
    Message<File> messageOut =
        MessageBuilder.withPayload(fileMessage.getPayload()).copyHeadersIfAbsent(fileMessage.getHeaders())
            .setHeaderIfAbsent("file-name", file.getName()).build();
    return messageOut;
  }

But the header doesn't seem to be added properly.

.11:32:33.248 [task-scheduler-1] DEBUG o.s.i.channel.DirectChannel - postSend (sent=true) on channel 'fileNameAddedToHeader', message: GenericMessage [payload=/home/cost1.txt, headers={timestamp=1418363253171, id=d119e90e-938c-89c3-803e-e980da3de2db, correlationId=d2d5bf51-0647-12db-916d-98884943c08b, file-name=GenericMessage [payload=/home/cost1.txt, headers={timestamp=1418363253170, id=2374031d-4cc8-43bc-f15a-8061c28bec51, correlationId=d2d5bf51-0647-12db-916d-98884943c08b, file-name=costcenter1.txt, sequenceSize=1, sequenceNumber=1}], sequenceSize=1, sequenceNumber=1}] 

It seems that file-name contains the header part instead of file name.

file-name=GenericMessage [payload=/home/cost1.txt, headers={timestamp=1418363253170, id=2374031d-4cc8-43bc-f15a-8061c28bec51, correlationId=d2d5bf51-0647-12db-916d-98884943c08b, file-name=costcenter1.txt, sequenceSize=1, sequenceNumber=1}]

I am expecting file-name=cost1.txt in the header. What am I doing wrong on setting the header? And is this task possible with SpEL to add file-name to header?

Upvotes: 0

Views: 4293

Answers (1)

Artem Bilan
Artem Bilan

Reputation: 121427

Yes, do that wrong way.

See:

<int:header name="file-name" ref="fileNameHeaderEnricher" method="enrichHeader"/>

It assumes that the result of that method will be populated to the file-name header.

Since your enrichHeader returns a Message object, we exactly see that in the end.

The SpEL variant looks better for your case:

<int:header name="file-name" expression="payload.name"/>

Note, if you are going use it for a downstream <int-file:outbound-channel-adapter> the header must be file_name - FileHeaders.

Upvotes: 1

Related Questions