如何使用 spring 集成 dsl 从 JMS 队列中解组 XML

Posted

技术标签:

【中文标题】如何使用 spring 集成 dsl 从 JMS 队列中解组 XML【英文标题】:How to Unmarshall XML from JMS queue Using spring integration dsl 【发布时间】:2018-12-25 13:17:46 【问题描述】:

因为我没有足够的声誉来评论关于此问题的其他话题

(How to unmarshall xml using spring integration dsl)

我必须创建一个新主题才能提出我的问题。 我有一个从队列轮询 XML 消息的 JMS,我想将这些消息转换为 Java 对象。 这是我写的代码

@Bean
public IntegrationFlow jmsMessageDrivenRedeliveryFlow() 
    return IntegrationFlows
            .from(Jms.messageDrivenChannelAdapter(new ActiveMQConnectionFactory("tcp://localhost:61616"))
                    .errorChannel(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
                    .destination("foo.bar").jmsMessageConverter(new MarshallingMessageConverter(jaxbMarshaller())))
            .handle(m -> System.out.println(m.getName())).get();


@Bean
public Marshaller jaxbMarshaller() 
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    return jaxb2Marshaller;

我想从 XML 创建的类是具有以下结构的 Customer 类

@XmlRootElement
public class Customer 

    String name;
    int age;
    int id;

    public String getName() 
        return name;
    

    @XmlElement
    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    @XmlElement
    public void setAge(int age) 
        this.age = age;
    

    public int getId() 
        return id;
    

    @XmlAttribute
    public void setId(int id) 
        this.id = id;
    


根据其他线程上的答案,我如何配置 Marshaller 以返回 Customer 对象? 提前非常感谢。

【问题讨论】:

【参考方案1】:

我看到你的Jms.messageDrivenChannelAdapter() 中有这个.jmsMessageConverter(new MarshallingMessageConverter(jaxbMarshaller())))。从 Spring 集成的角度来看,这就是您所需要的一切。

既然你还有一个问题,我想你的问题是如何教 Jaxb2Marshaller 看到你的 Customer 并正确解组。

这已经是一个 JAXB 问题:https://www.oracle.com/technetwork/articles/javase/index-140168.html

并且在提到的Jaxb2Marshaller中是这样的一个属性:

/**
 * Set the list of Java classes to be recognized by a newly created JAXBContext.
 * <p>Setting either this property, @link #setContextPath "contextPath"
 * or @link #setPackagesToScan "packagesToScan" is required.
 */
public void setClassesToBeBound(@Nullable Class<?>... classesToBeBound) 

【讨论】:

非常感谢!将 setClassesToBound 设置为我的类 Customer 使其工作!

以上是关于如何使用 spring 集成 dsl 从 JMS 队列中解组 XML的主要内容,如果未能解决你的问题,请参考以下文章

Spring集成Java DSL:指定自定义反序列化器

弹簧集成dsl缓冲区

在 java 1.7 中将 JMS 出站通道适配器转换为等效的 Spring Integration DSL

如何在spring集成消息中设置JMS Header

Spring Integration DSL JMS 入站/出站网关

Spring Integration DSL 中的路由