在Spring Integration中的Message标头中设置文件名

时间:2014-12-12 05:58:27

标签: java spring spring-integration

我想在Message的标题中设置文件名。所以我把标题放得更加丰富:

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

更丰富的方法是:

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

但标题似乎没有正确添加。

.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}] 

似乎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}]

我期待标题中的file-name=cost1.txt。我在设置标题时做错了什么? Spel是否可以通过向头文件添加文件名来完成此任务?

1 个答案:

答案 0 :(得分:1)

是的,做错了。

请参阅:

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

它假定该方法的结果将填充到file-name标题。

由于您的enrichHeader会返回Message个对象,我们最终会看到它。

SpEL变体看起来更适合您的情况:

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

注意,如果您要将其用于下游<int-file:outbound-channel-adapter>,则标头必须为file_name - FileHeaders