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

How to Unmarshall XML from JMS queue Using 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 创建的 class 是具有以下结构的客户 class

@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;
    }

}

根据其他线程上的答案,我如何将编组器配置为 return 客户对象? 非常感谢。

我看到你的 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) {