gpt4 book ai didi

java - Spring Integration 和 JAXB 范围

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:09 25 4
gpt4 key购买 nike

我问一个关于 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;
}
}

我已经想出了几种方法来实现它,所以我不会陷入困境,但它困扰着我。为什么对象不保留其值(value)?或者 JAXB bean 中是否有我可以打开或配置的内容。我研究过并尝试了很多方法都无济于事。

戴夫

这是解码器

    <!--  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 中使用它吗?

再次感谢您的帮助。

戴夫

最佳答案

好吧,您可以使用 MessageHeaders 来满足您的要求。只需将您的原始有效负载放置到 header 中,并在marshaller之后使用它。这是因为消息的有效负载在每个转换器之后都会改变。但要小心,当您的有效负载可变时, header 中的对象也会更改。

关于java - Spring Integration 和 JAXB 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25650964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com