org.springframework.messaging.converter.MessageConversionException:无法转换

问题描述 投票:0回答:1

我们有一个使用 Spring Boot 和 Tibco EMS JMS 实现的应用程序。当我在本地 Tomcat 上创建战争并部署时,我可以毫无问题地发送和接收消息。但是,如果我从 main() 方法运行应用程序:

@SpringBootApplication
public class Main {
 public static void main(String[] args) {       
    SpringApplication.run(Main.class, args);
 }
}

作为 Run as> Spring Boot App,我在发送消息以供使用时立即看到此错误。

这是创建和发送消息的地方:

@Transactional
private void sendAndLog (Long id1, Long id2, String s, List<Mapping> mappings) {
    queue.send(new Request (
            id1,
            id2,
            s,
            mappings));
    log.info("Message sent.");
}

这是它被消耗的地方 - 我在调用 send() 之后立即看到错误并且永远不会到达 receive() 方法:

Processor.java:

@Transactional
public void receive (Request mappings) {
    // Process the message
}

这是请求类:

public class Request implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id1;
    private Long id2;   
    private String s;   
    private List<Mapping> mappings;

    public Request() {}
    public Request (Long id1, Long id2, String s, List<Mapping> mappings) {
        this.id1 = id1;
        this.id2 = id2;
        this.s = s;
        this.mappings = mappings;
    }

    //getter() and setter() methods.
}

这是错误。

出了什么问题以及为什么我“仅”在使用 Spring Runner 运行时看到此错误,而不是在部署到 Tomcat 时看到此错误?

2018-07-25 17:19:19.924  WARN 4796 --- [enerContainer-7] o.s.j.l.DefaultMessageListenerContainer  : Execution of JMS message listener failed, and no ErrorHandler has been set.

org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method could not be invoked with incoming message
Endpoint handler details:
Method [public void com.package.tasks.Processor.receive(com.package.dto.Request)]
Bean [com.package.tasks.Processor@475d2a6d]
; nested exception is org.springframework.messaging.converter.MessageConversionException: Cannot convert from [com.package.dto.Request] to [com.package.dto.Request] for org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@6d5d2920, failedMessage=org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@6d5d2920
    at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118)
    at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:77)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [com.package.dto.Request] to [com.package.dto.Request] for org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@6d5d2920
    at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:144)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:114)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:137)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:109)
    at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:114)
    ... 10 common frames omitted

17:19:19.924 [DefaultMessageListenerContainer-7] WARN  o.s.j.l.DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
spring-boot jms spring-jms tibco-ems springrunner
1个回答
0
投票

首先,你应该调试看看发生了什么。 替换“对象”的参数类型,开始调试并查看您收到的对象类型。尝试在调试模式下手动转换对象,看看发生了什么。

消息令人困惑,看看你的应用程序的包装,看看你是否可以在不同的 jar 中有多个 dto 和相同的包。如果您只有 SpringRunner 有问题,则可能是您的本地 Tomcat 中不存在依赖项,这就是您出现错误的原因。

另外,可能不是问题的根源,但是私有方法上的@Transactionnal 通常不起作用,这取决于您运行代码的位置(Eclipse run config、gradle、tomcat 等)。像这样的注释应该在公共方法上进行。我将不得不进行研究,但我的猜测是,当您在上下文中从组件调用方法时,当它看到 @Transactional 时,spring 会注入事务。由于您从另一个公共方法调用了私有方法,因此 Spring 可能不会注入它。

© www.soinside.com 2019 - 2024. All rights reserved.