2014-09-03 73 views
1

我在问一个关于JAXB如何维护与生成的类相关联的值的常见问题。我可以生成这个类,只要它在有效载荷中就可以使用它,但是当我继续进行另一个Spring集成过程时,该对象似乎不会保留这些值。我知道必须有一个简单的方法来确保生成的对象保留它所填充的内容。我可以重新实例化类,但这只是一个新的空类。Spring集成和JAXB范围

这里是有点什么,我试图完成

一个基本的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集成组件,直到我得到一个路由器,我想用一个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中的某些东西。我研究过它,并尝试了很多东西都无济于事。

戴夫

这里是向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.a[email protected]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.a[email protected]6671e17f稍后在上下文中,我可以在POJO中使用它吗?

再次感谢您的帮助。

戴夫

+0

请显示您的'xmlMarshaller'配置。 – 2014-09-03 19:44:10

+0

请显示你的'message.getPayload()' – 2014-09-03 20:44:52

回答

1

好了,你可以用MessageHeaders克服你的要求。将您的original有效负载放置到标题中,然后在marshaller之后使用它。这是因为在每个transformer之后,消息的​​被更改。但是,当你的有效载荷是可变的时候要小心,所以你的头文件中的对象也会被改变。

+0

这就是我在一个版本上做的。另一个版本我使用了一个服务激活器,并将有效负载值分配给一个类。这就是我现在使用的。我只是好奇,如果我错过了一些东西,或者有一种我缺乏的配置。谢谢Artem和Gary。 – djratliff 2014-09-09 17:39:07