Spring集成和JAXB范围



我问了一个关于JAXB将如何维护与生成的类相关联的值的一般问题。我可以生成类,只要它在有效负载中就可以使用它,但当我转到另一个spring集成过程时,对象似乎不会保留这些值。我知道必须有一种简单的方法来确保生成的对象保留它所填充的内容。我可以重新实例化这个类,但这只是一个新的空类。

以下是我试图完成的

要生成的基本XML文档

<ElementA>
        <Element1>Value1</Element1>
        <Element2>Value2</Element2>
        <Element3>
            <ElementYY>ValueYY</ElementYY>
        </Element3>
</ElementA>
<ElementB>ElementBValue</ElementB>

这将生成

    JAXBGeneratedClass

然而,我选择获得可以使用的xml,然后我将其分解为

    <!--  JAXB UnMarshalling transformer to generate object from XML -->    
<int-xml:unmarshalling-transformer 
    id="unmarshallMessage"
    unmarshaller="xmlMarshaller"
    input-channel="input-channel"
    output-channel="output-channel" />

然后,我在流程中有其他Spring Integration组件,直到我到达一个路由器,在那里我想使用POJO来评估它

    <!--  Route it accordingly -->
<int:router 
    id="jaxb-router"
    input-channel="input-router-channel"
    ref="evaluationClass"
    method="evaluateAction"
    default-output-channel="discard-channel">
        <int:mapping value="new" channel="new-channel" />
        <int:mapping value="update" channel="update-channel" />
        <int:mapping value="duplicate" channel="duplicate-channel" />
        <int:mapping value="error" channel="error-channel" />
</int:router>

这就是我无法获得对象值的地方,它似乎没有保留它曾经拥有的东西。

@Component("evaluationClass")
public class EvaluationClass {
     final Logger log = LogManager.getLogger(EvaluationClass.class);
     JAXBGeneratedClass myObject;
     public String evaluateAction(Message<?> message) {
          /*Use values from myObject*/
          /*Do comparison on the message using mObject*/
         if (myObject.getElementA().getElement3().getElementYY() 
                     != message.getPayload().value) {
          /* Evaluation */
         }
        return statusValue;
       }
    }

我已经想出了几种方法来实现它,所以我不会拘泥于此,但它一直困扰着我。为什么这个对象不能保持它的价值?或者JAXB bean中是否有我可以打开或配置的东西。我对它进行了研究,尝试了很多方法,但都无济于事。

Dave

这是Unmarshaller

    <!--  JAXB unmarshalling Transformer bean -->  
<bean id="xmlMarshaller" name="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list value-type="java.lang.Class">
            <value>org.agency.schema.jmsupdateservice.ObjectFactory</value>
            <value>org.agency.schema.jmsupdateservice.CourtCaseInitiatedNotificationMsg</value>
            <value>org.agency.schema.CourtCaseInitiatedNotification</value>
        </list>
    </property>
    <property name="schema" value="classpath:schemas/JMSUpdateService.xsd" />
</bean>

我最初只是在值列表中有ObjectFactory。

有效载荷:

[Payload CourtCaseInitiatedNotificationMsg content=org.agency.schema.jmsupdateservice.CourtCaseInitiatedNotificationMsg@6671e17f][Headers={JMS_IBM_Character_Set=UTF-8, JMS_IBM_MsgType=8, JMSXUserID=jsg589      , JMS_IBM_Encoding=546, history=caseNumber-inbound-adapter,caseNumber-source-channel,caseNumber-inbound-source-log-service,caseNumber-source-message-logged-channel,caseNumber-xslt-transform,caseNumber-xsltTransform-channel,caseNumber-inbound-filter-valid,caseNumber-xsltTransform-valid-channel,unmarshallCaseNumber,caseNumber-jaxb-channel,caseNumber-jaxb-payload-service,caseNumber-payload-persisted-channel, priority=0, jms_timestamp=1409774002830, JMSXAppID=WebSphere MQ Client for Java, JMS_IBM_PutApplType=28, JMS_IBM_Format=MQSTR   , jms_redelivered=false, JMS_IBM_PutDate=20140903, JMSXDeliveryCount=1, JMS_IBM_PutTime=19532283, jms_messageId=ID:414d51204843534f4445564c2e514d4753f24b622007b203, id=f13a0b5b-1e96-394d-e2fa-8578de021f7a, timestamp=1409774011053}]

当对象是有效负载时,我可以使用它,但之后它就不会在CourtCaseInitiatedNotificationMsg中保留值。如果我试图引用那个对象,它是空的。它不应该还可以使用吗?

我知道这与我发布的内容不同,因为我只是想知道JAXB类的范围和长度,或者它是否保留了它作为有效负载时的值。这还可以访问吗->org.agency.schema.jmsupdateservice.CourtCaseInitiatedNotificationMsg@6671e17f稍后在上下文中,我可以在POJO中使用它吗?

再次感谢您的帮助。

Dave

好吧,您可以用MessageHeaders来满足您的需求。只需将您的original有效负载放在标头中,并在marshaller之后使用它。这是因为消息的payload在每次transformer之后都会发生变化。但是,当您的有效负载是可变的时,请小心,因此,标头中的对象也会发生更改。

最新更新