代码之家  ›  专栏  ›  技术社区  ›  Ver

在Spring的兔子监听器中JSON对象序列化到Java对象抛出异常

  •  0
  • Ver  · 技术社区  · 7 年前

    我想和春天的兔子听众一起听兔子排队的消息。我的课看起来很基础,像这样:

    组件 公共类mailmessagerabitlistener{ 私人邮件存储库邮件存储库; 私人邮件服务; @自动售货机 公用mailmessagerabbitlistener(mailrepository mailrepository,mailservice mailservice){ this.mailrepository=mailrepository; this.mailservice=邮件服务; } @豆 public messageconverter messageconverter()。{ 返回新jackson2jsonMessageConverter(); } @rabbitListener(queues=“msmail.queue”)。 public void receivemailmessage(jsonmailmessage jsonmailmessage)引发异常{ system.out.println(jsonmailmessage); } } < /代码>

    我的映射类jsonmailmessage如下所示:

    数据 @无argsconstructor @所需argsconstructor 公共类jsonmailmessage{ @非空 私有字符串usertoken; @非空 私有字符串sendto; @非空 私有字符串主题; @非空 私有字符串内容; @非空 私有字符串[]文件; } < /代码>

    现在我可以成功地监听一个队列,问题是当我在Rabbit队列中发送这样的消息时:

    JSON数组中填充了base64编码的文件,这些文件应该是基本的字符串表达式,因此jackson2jsonMessageConverter应该能够转换这些文件。

    但是我得到了这种例外:

    bean[-------messaging.mailmessagerabbitlistener@35ff072c]
    在Org.Spring Frask.AMQP.List.Addia.MasaGeMasigelistNealAdvult.NojKeDebug处理程序(Masiging MasigelistNealAdvult.java:185)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.List.Addia.MasaGeMasigelistNeldAdvult.OnMead(Masiging MasigelistNealAdvult.java:120)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.MistaGeleListEngultCult.DoNoWoKeListNeX(ActudioMasigelistEngultPort.java:1414)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.MistaGeleListEngultCortual.StudialVooKeListNeX(ActudioMasgelistEngultPort.java:1337)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.MistaGeleListEngultPort.IvoKeListNeX(ActudioMasigelistEngultPort.java:1324)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.MistaGeleListEngult.CuultUpLististor(ActudioMasigelistEngultPort.java:1303)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.List.SistimeEaseListEngultBaseDoreCeVeNeXECUTE(SimeMaseGelistEngultPort.java:785)[Spring Rabtudi-2.0.3.Prave.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.List.SistimeEaseListNealPort.Access and AdExcEutt(SimeMaseGelistEngultPort.java:769)[Spring Rabtudi-2.0.3.Prave.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.List.Histelist.SimulMeSigelistEngult.Access 700美元(SimuleSigelEistNealPort.java:77)[Spring Rabtudi-2.0.3.Relp.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.List.SimuleMeAgEistReleNaveCase$AssiCaseMealPractualAudio.Run(SimeMeaseGelistEngult.java:1010)[Spring Rabtudi-2.0.3.Pravor.jar:2.0.3.发布版]
    在Java.Lang.Trime.Run(线程.java:748)[Na:1.80Y171]
    由以下原因引起:org.springframework.messaging.converter.messageconversionexception:无法将genericmessage[有效载荷=字节[118],headers=amqp_ReceivedDeliveryMode=非持久,amqp_ReceivedRoutingKey=msmail.queue,amqp_DeliveryTag=1,amqp_ConsumerQueue=msmail.queue,amqp_Redelivered=false,id=b997e8c从[b]转换为[dto.jsonmailmessage]B-3424-DF90-5370-AA4CF79175BE,AMQP_ConsumerTag=AMQ.CTAG-LL9Y6R67FJC6Dychaiwqra,Content Type=Application/JSON,Timestamp=1538554985476]
    在Org.Spring Frask.Engors.Held.Actudi.Suff.PayLoad GrimeUnjortServer . DealVielGuePort(PayLoad GracuMeTunver,Java:144)~[ Spring MeasAgEng5.0.5.Selp.jar:5.0.5.版本号]
    在Org.Spring框架中。消息处理程序。调用。
    在Org.Spring Frask.Engors.Huffor.Cuaso.VoCababl HooLeRead .GETMultAgMultEngValts(VoCabable HooLeRead方法.java:137)~[Spring MeasAgEng5.0.5.Sprel.jar:5.0.5.发布版]
    在Org.Spring Frask.Engors.Huffor.Cuaso.VoCabable HooLeReal.PoCKE(VoCabable HooLeRead方法.java:109)~[Spring MeasAgEng5.0.5.Sprel.jar:5.0.5.发布版]
    在Org.Spring Frask.AMQP.List.List.Advult.Hell适配器Adv.KooKE(HANDLRealAdvult.Java:51)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.List.Addia.MasaGeMasigelistNealAdvult.NojKeDebug处理程序(Masiging MasigelistNealAdvult.java:182)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    …省略10个常用框架
    < /代码> 
    
    

    更新

    <>它正在工作,消息被转换成Java对象。当我想直接从listener方法返回对象时,问题就开始了。

    @rabbitlistener(queues=“msmail.queue”)。
    公共jsonmailmessage receivemailmessage(jsonmailmessage jsonmailmessage){
    返回jsonmailmessage;
    }
    < /代码> 
    
    

    它引发不同的异常:

    caused by:org.springframework.amqp.amqpException:cannot determine reply to message property value:request message does not contain reply to property,and no default response exchange was set.
    在Org.Spring Frask.AMQP.ListAdv.AddiabdTabelEaseEistister-GETRealytoToIP(AdExabdTabelEaseListist.java:398)~[Spring Rabtu-2.0.3.Pravor.jar:2.0.3.发布版]
    在Org.Spring Frask.AMQP.ListAdv.AddiabdTabelEaseListist.HuffLeReSurt(Advestabl Agelistist.java:307)~[Spring Rabtudi-2.0.3.Prave.jar:2.0.3.发布版]
    …省略10个常用帧
    < /代码> <

    我的映射类jsonmailmessage如下所示:

    @Data
    @NoArgsConstructor
    @RequiredArgsConstructor
    public class JsonMailMessage {
        @NonNull
        private String userToken;
        @NonNull
        private String sendTo;
        @NonNull
        private String subject;
        @NonNull
        private String content;
        @NonNull
        private String[] files;
    
    }
    

    现在我可以成功地监听一个队列,问题是当我在Rabbit队列中发送这样的消息时:

    RabbitMessage

    JSON数组中填充了base64编码的文件,这些文件应该是基本的字符串表达式,因此jackson2jsonMessageConverter应该能够转换这些文件。

    但是我得到了这种例外:

    Bean [---------messaging.MailMessageRabbitListener@35ff072c]
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:185) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:120) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1303) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:785) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:769) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1010) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
    Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [-----dto.JsonMailMessage] for GenericMessage [payload=byte[118], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=msmail.queue, amqp_deliveryTag=1, amqp_consumerQueue=msmail.queue, amqp_redelivered=false, id=b997e8cb-3424-df90-5370-aa4cf79175be, amqp_consumerTag=amq.ctag-lL9Y6R67fJc6DyCHAiWQRA, Content-Type=application/json, timestamp=1538554985476}]
        at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:144) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:116) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:137) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:109) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:51) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:182) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        ... 10 common frames omitted
    

    更新

    它正在工作,消息被转换成Java对象。当我想直接从listener方法返回对象时,问题就开始了。

     @RabbitListener(queues = "msmail.queue")
    public JsonMailMessage receiveMailMessage(JsonMailMessage jsonMailMessage){
      return jsonMailMessage;
    }
    

    它抛出不同的异常:

    Caused by: org.springframework.amqp.AmqpException: Cannot determine ReplyTo message property value: Request message does not contain reply-to property, and no default response Exchange was set.
        at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.getReplyToAddress(AbstractAdaptableMessageListener.java:398) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:307) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
        ... 10 common frames omitte
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Gary Russell    7 年前

    这个 content_type 是众所周知的属性not和任意头;将其添加到 Properties: 相反。

    单击 ? 在UI中查看已知属性。

    由于没有内容类型,转换器只返回 byte[] 不变。