使用 Boot 2.2.6 和 SI 5.2.5,我试图用一个对象来丰富报头。然而,在流程的第二次传递中,新的报文头确实包含了一个新的消息 UUID(所以我知道它是一个新的报文头),但丰富的报文头并没有被新的对象所取代,而是包含了以前的对象。
比如说
@Configuration
public class MyFlow {
public static class Original {
String original;
UUID uuid;
public Original() { uuid = UUID.randomUUID(); }
public void setOriginal(String s) { original = s; }
public String getOriginal() { return original; }
}
@Bean IntegrationFlow doIt() {
return IntegrationFlows
.from("somewhere")
.enrichHeaders(h -> h.header("ORIGINAL", new Original()))
.handle((p, h) -> {
System.err.println(h); // --1
Original original = (Original) h.get("ORIGINAL");
original.setOriginal(p.toString());
System.err.println(h); // --2
})
.channel("next")
.get();
}
}
在第一次传递的时候。
-- 1 original.uuid = new UUID, original.original = null。
-- 2 original.uuid = 和以前一样,original.original = 新的有效载荷。
在第二道。
-- 1 original.uuid = 同前,original.original = 同前;
-- 2 original.uuid = 和以前一样,original.original = 新的有效载荷。
我想 Original
是一个新的对象。我认为 class Original
或 enricherHeaders
是不正确的。我到底错在哪里?
默认情况下,头不会被覆盖。
h -> h.defaultOverwrite(true).header("ORIGINAL", new Original())
或者
h -> h.header("ORIGINAL", new Original(), true);
你通常会用第一个多头。