当前位置: 首页 > 知识库问答 >
问题:

Spring集成和JAXB范围

方昊阳
2023-03-14

我想问一个关于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集成组件,直到我到达一个路由器,在那里我想使用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>

我最初只是在值列表中有对象工厂。

有效载荷:

[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}]

当对象是有效负载时,我可以使用它,但在此之后,它不会保留CourtCase初始通知Msg中的值。如果我尝试引用该对象,它是null。不应该还能用吗?

我知道这与我发布的内容不同,因为我只是想知道JAXB类的范围和多长时间,或者它是否保留了它作为有效负载时曾经拥有的值。这还能用吗-

再次感谢你的帮助。

戴夫

共有1个答案

段干靖
2023-03-14

那么,您可以通过MessageHeaders来克服您的需求。把你的原始的有效载荷放置到标头,然后在封送器之后使用它。这是因为消息的有效负载在每个变压器之后都会更改。但是要小心,当你的有效负载是可变的,所以,你在标题中的对象也会被改变。

 类似资料:
  • 嗯,很可能没有任何谜团,但我只是不够聪明,不知道我的问题是什么。然而,通常它毕竟是谜团! 很抱歉进行介绍,我的问题是原型范围似乎不适合我。我创建了一个带有Spring集成流的REST服务(流前面有一个http入站网关)。大多数bean的作用域都是原型。我通过使用线程调用它十次来测试流。此外,我还记录了bean引用(只需在被调用的对象中打印“this”),并且我看到了十次相同的引用! 据我所知,这意

  • 问题内容: 我想使用Spring Batch和Spring Integration从数据库导入数据,并将它们写入文件,然后通过ftp将其传输到远程服务器。 但是我想我的问题是我不想为我的表创建域对象。我的查询是随机的,我想要一些可以读取数据并将其写入文件并进行传输的东西。 是否可以在不创建各自的域对象的情况下使用Spring Batch和Integration? 问题答案: 绝对。您可以将JDBC

  • Spring是一个流行的Web框架,它提供易于集成与很多常见的网络任务。所以,问题是,为什么我们需要Spring,当我们有Struts2?Spring是超过一个MVC框架 - 它提供了许多其它好用的东西,这是不是在Struts。例如:依赖注入可以是有用的任何框架。在本章中,我们将通过一个简单的例子来看看如何集成Spring和Struts2一起。 首先,需要添加下列文件到项目的构建路径从Spring

  • 我正在尝试使用几个s-vaadin、jsp等实现一个应用程序。 它使用简单的,但后来我决定使用vaadin作为ui。 我创建了vaadin servlet(Spring的servlet也留下了)。我的看起来像这样 我创建了vaadin组件并根据我的需要对其进行了调整。我使用自动装配进行服务。 也是一个Spring bean。 < code>ProjectRepository是另一个spring b

  • 我正在使用一个Spring Boot+Spring Security OAuth2应用程序,我相信它的灵感来自Dave Syer的示例。应用程序被配置为OAuth2授权服务器,具有使用资源所有者密码凭据流的单个公共客户端。成功的令牌被配置为JWT。 公共Angular客户机向/oauth/token发送一个POST请求,该请求带有包含客户机id和秘密的基本身份验证头(这是让客户机进行身份验证的最简

  • 问题内容: 任何人都可以在此处粘贴简单的步骤来集成Spring Security和CAS,以进行单点登录和单点退出。注意我不需要任何基于角色的访问。我有一个已经与spring security集成的Web应用程序。现在,我尝试使用CAS执行SSO,但是出现此错误 这是我当前的spring security.xml 这是我的web.xml 这是我的Spring-rootcontext.xml 这是我