配置Spring Boot JMS应用程序以使用JAXB编组作为默认值的最简单方法是什么?

时间:2016-04-04 21:05:48

标签: java spring jaxb jms spring-jms

使用Spring Boot REST端点,似乎如果JAXB可用,只需传递'application / xml'的'Accept'标头就足以从一个非常简单的端点接收输出作为XML,只要@Xml ......注释存在于实体上。

@RequestMapping(value = "/thing/{id}")
ResponseEntity<Thing> getThing(
        @PathVariable(value = "id") String id) {
    Thing thing = thingService.get(id)

    return new ResponseEntity<Thing>(thing, HttpStatus.OK);
}

但是,在调用jmsTemplate.convertAndSend(destination, thing)时,我必须明确地将消息转换器插入到内部具有以下代码的JMS模板中

        JAXBContext context = JAXBContext.newInstance(object.getClass());
        Marshaller marshaller = context.createMarshaller();
        StringWriter writer = new StringWriter();
        marshaller.marshal(object, writer);

        TextMessage textMessage = session.createTextMessage(writer.toString());

        return textMessage;

我正在使用带有注释的JavaConfig和这些消息依赖项:

compile("org.springframework:spring-jms")
compile('org.springframework.integration:spring-integration-jms')
compile("org.apache.activemq:activemq-broker")

还包括Spring Boot启动器中的这些,但不确定它们在这里是否重要。

compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-hateoas')

我也在使用Groovy和Spock。

似乎肯定有一些方法可以在没有代码的情况下默认完成此编组操作。建议?

2 个答案:

答案 0 :(得分:3)

我最终明确地从Spring OXM框架插入了Jaxb2Marshaller。我做的很笨,因为我正在进行SpringBoot和基于注释的配置,并且示例都是XML。

@Autowired
JmsTemplate jmsTemplate

...

@Bean
MessageConverter messageConverter() {
    MarshallingMessageConverter converter = new MarshallingMessageConverter()
    converter.marshaller = marshaller()
    converter.unmarshaller = marshaller()
    // set this converter on the implicit Spring JMS template
    jmsTemplate.messageConverter = converter
    converter
}

@Bean
Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller()
    marshaller.classesToBeBound = [My.class, MyOther.class]
    marshaller
}

我喜欢做得更简单,但我担心现在必须这样做。

答案 1 :(得分:0)

实际上,MessageConverter可以自动连接(至少如果您将JmsAutoConfiguration与Spring Boot 2和Spring jms 5一起使用)。因此,无需手动设置它,仅创建bean就足够了:

@Bean
MessageConverter messageConverter(Jaxb2Marshaller marshaller) {
    MarshallingMessageConverter converter = new MarshallingMessageConverter();
    converter.setMarshaller(marshaller);
    converter.setUnmarshaller(marshaller);

    return converter;
}