Трансформатор Spring Integration DSL

Могу ли я получить помощь по следующей проблеме: при вызове преобразователя для преобразования входного объекта в объект карты и вызове обработчика в обработчике отсутствуют значения заголовка, добавленные ранее. Почему при преобразовании полезной нагрузки в объект Map теряются все заголовки?

//Adding header here setHeader("t", "t");
@ResponseBody
public EmResponse getAuditTrail(@Valid @RequestBody NGAuditTrailEntry auditEntry) {
    LOG.info("Audit Service Called, creating new audit " + auditEntry);
    AuditCreationFlow.CreateAuditGateway auditGateway = applicationContext.getBean(AuditCreationFlow.CreateAuditGateway.class);
    MessageBuilder messageBuilder = MessageBuilder.withPayload(auditEntry).setHeader("t", "t");
    Object response = auditGateway.createAudit(messageBuilder.build());
    EmResponse res = new EmResponse();
    LOG.info("Done with Audit creation. Response " + response);
    return res;
}
//Integration flow starts here
public IntegrationFlow createAuditGatewayFlow() {
    LOG.debug("Entered to spring integration flow to create the Audit entry");
    return IntegrationFlows.from("auditInputChannel")
        .handle(auditObjTransformer, "transformToEjbCompatible")
        .handle(ejbCaller, "callEjb")
        .get();
}
//Transforming payload object to map
@Component
public class AuditObjTransformer {
    private final Logger LOG = LoggerFactory.getLogger(this.getClass());

    @Transformer
    public Object transformToEjbCompatible(NGAuditTrailEntry ngAuditTrailEntry, Map<String, Object> headers) {
        LOG.debug("Transforming the NGAuditTrailEntry To AuditEntry object which is EJB compatible");

        //@TODO - Tranformation code goes here.

        String s = ngAuditTrailEntry.getObjectName();
        Map<String, String> m = new HashMap<>();
        m.put("x", s);
        return m;
    }
//Here in this handler, not getting headers what I added in the rest service above.
public class EJBCaller {
    private final Logger LOG = LoggerFactory.getLogger(this.getClass());

    public Object callEjb(Object payload, Map<String, Object> headers) throws EJBResponseException {
        LOG.debug("Calling Audit EJB to crated Audit entry.");

        //@TODO EJB calling code goese here.

        LOG.debug("Returned from EJB after creating Audit entry. Returned value" + payload);
        return payload;
    }

Если преобразование отличается от карты, то в заголовках проблем нет.

Спасибо, Шива


person Sdubba    schedule 17.07.2017    source источник


Ответы (1)


 callEjb(Object payload, Map<String, Object> headers) 

Если полезной нагрузкой является Map, у вас есть эта полезная нагрузка в payload и headers аргументах метода одновременно.

Чтобы он работал и переносил точно headers в этот Map аргумент, вы должны использовать аннотацию @Headers:

 * Annotation which indicates that a method parameter should be bound to the headers of a
 * message. The annotated parameter must be assignable to {@link java.util.Map} with
 * String keys and Object values.
person Artem Bilan    schedule 18.07.2017