Spring Integration DSL变压器

时间:2017-07-17 23:28:59

标签: spring-integration spring-integration-dsl

我可以在下面的问题上获得一些帮助: 调用转换器将输入对象转换为Map Object并调用处理程序,处理程序缺少之前添加的标头值。 为什么要将有效负载转换为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;
    }

如果transform不是map,那么标题中没有问题。

谢谢, 希瓦

1 个答案:

答案 0 :(得分:1)

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

如果有效负载是Map,则您同时拥有payloadheaders方法参数中的有效负载。

要使其正常工作并且headersMap参数完全匹配,您应该在其上使用@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.