2014-09-03 65 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