如何使用Spring Integration DSL从JMS队列中解组XML

时间:2018-07-17 18:29:07

标签: spring-integration spring-integration-dsl

由于我没有足够的声誉来评论与此有关的另一个主题

How to unmarshall xml using spring integration dsl

我必须创建一个新主题才能提出自己的问题。 我有一个JMS,它从队列中轮询XML消息,并且我想将这些消息转换为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返回客户对象? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

由于您仍然有疑问,我想您的问题是如何教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) {