2017-07-20 2 views
2

私のプログラムは、json文字列メッセージをキューに送信し、メッセージをjsonオブジェクトに変換してサービスアクティベータを呼び出します。サービスアクティベータはjsonオブジェクトを引数として取り込み、 "employer"プロパティがハッシュテーブルにあるかどうかをチェックし、jsonオブジェクトに "count"というプロパティを追加します。プロパティがテーブルにある場合は1に設定され、そうでない場合は-1になります。Spring統合サービスアクティベータが動作していません

次に、更新されたjsonオブジェクトは文字列に変換され、別のキューに送られます。

ただし、service-activatorが機能していません。このエラーが発生します(完全なスタックトレースは添付コードの下にあります)。

java.lang.NoSuchMethodError: org.springframework.messaging.MessageHandlingException: 
method <init>(Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found 

しかし、この方法ははっきりと存在します。なぜ私はThrowableを私の主張に入れようとしているのですか?私は(フルスタック・トレースは添付のコードの下にある)ことをやってみましたし、このエラーを得た:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ConsumerEndpointFactoryBean#2': Cannot resolve reference to bean 'org.springframework.integration.config.ServiceActivatorFactoryBean#0' while setting bean property 'handler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ServiceActivatorFactoryBean#0': FactoryBean threw exception on object creation; 
nested exception is java.lang.IllegalArgumentException: Target object of type [class SpringMessaging.MessageImprover] has no eligible methods for handling Messages. 

私は、元のJSON文字列メッセージを作成するためにMessageCreatorと呼ばれるクラスを使用して、その後にMessageImproverと呼ばれるクラスですそれを更新する。 コード:

package SpringMessaging; 

public class MessageCreator { 
public String messageJson; 
public String employer; 
public int sourceID; 

public void add(String name, int age) { 

    messageJson = "{" + 
      "\"employer\": \"" + name + "\"" + 
      ", \"sourceID\": " + age + 
      '}'; 

} 
public String getJson(){ 
return messageJson; 
} 

} 

メッセージ向上剤:JSONオブジェクト変圧器に

package SpringMessaging; 

import java.util.HashMap; 
import org.json.JSONObject; 


public class MessageImprover { 

    public JSONObject improve(JSONObject object) { 
     int count; 
     HashMap<String, Integer> table = new HashMap<String, Integer>(); 
      table.put("Icelantic", 8); 
      table.put("Nordica", 9); 
      table.put("Atomic", 10); 
      table.put("Volkl", 11); 
      table.put("Marker", 12); 
     if(table.containsKey(object.getString("employer"))) { 
      count = 1; 
     } else { 
      count = -1; 
    } 
     object.put("count", count); 

    return object; 
} 

} 

文字列:

import org.json.JSONObject; 

public class stringtoJsonObject { 

    public JSONObject jsonFromString(String messageJson) { 
     JSONObject object = new JSONObject(messageJson); 
     return object; 
    } 
} 

構成:

送信:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:int="http://www.springframework.org/schema/integration" 
    xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp" 
    xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
         http://www.springframework.org/schema/beans/spring-beans.xsd  
         http://www.springframework.org/schema/integration  
         http://www.springframework.org/schema/integration/spring-integration.xsd 
         http://www.springframework.org/schema/integration/amqp 
         http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd 
         http://www.springframework.org/schema/rabbit 
         http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> 

    <rabbit:connection-factory id="connectionFactory" host="bigdata-rdp" username="myuser" password="mypass" /> 
    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /> 
    <rabbit:admin connection-factory="connectionFactory" /> 
    <rabbit:queue name="first" auto-delete="false" durable="true" /> 
    <rabbit:queue name="second" auto-delete="false" durable="true" /> 

    <rabbit:fanout-exchange name="first-exchange" auto-delete="true" durable="true"> 
    <rabbit:bindings> 
    <rabbit:binding queue="first" /> 
    </rabbit:bindings> 
    </rabbit:fanout-exchange> 

    <int:channel id="senderChannel">  
    </int:channel> 

    <int-amqp:outbound-channel-adapter channel="senderChannel" exchange-name="first-exchange" amqp-template="amqpTemplate" /> 

    <int-amqp:outbound-gateway id="outbound" request-channel="senderChannel" exchange-name="first-exchange" amqp-template="amqpTemplate" /> 

    <int:gateway id="Sender" service-interface="SpringMessaging.Sender" default-request-channel="senderChannel"> 
    <int:method name="sendMessage" /> 
    </int:gateway> 

    <int:poller default="true" fixed-rate="100"/> 

</beans> 

、最初のキューから受信変換、更新、2番目のキューへの送信:最初のエラーから

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:int="http://www.springframework.org/schema/integration" 
    xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp" 
    xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
         http://www.springframework.org/schema/beans/spring-beans.xsd  
         http://www.springframework.org/schema/integration  
         http://www.springframework.org/schema/integration/spring-integration.xsd 
         http://www.springframework.org/schema/integration/amqp 
         http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd 
         http://www.springframework.org/schema/rabbit 
         http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> 

    <rabbit:connection-factory id="connectionFactory" host="bigdata-rdp" username="myuser" password="mypass" /> 
    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /> 
    <rabbit:admin connection-factory="connectionFactory" /> 
    <rabbit:queue name="first" auto-delete="false" durable="true" /> 
    <rabbit:queue name="second" auto-delete="false" durable="true" /> 

    <int:poller default="true" fixed-rate="100"/> 

    <rabbit:fanout-exchange name="second-exchange" auto-delete="true" durable="true"> 
    <rabbit:bindings> 
     <rabbit:binding queue="second" /> 
    </rabbit:bindings> 
    </rabbit:fanout-exchange> 

    <int-amqp:outbound-channel-adapter channel="messageOutputChannel" exchange-name="second-exchange" amqp-template="amqpTemplate" /> 

    <int-amqp:inbound-channel-adapter channel="messageInputChannel" queue-names="first" connection-factory="connectionFactory" /> 

    <int:channel id="messageInputChannel" /> 
    <int:channel id="jsonInputChannel"/> 
    <int:channel id="jsonOutputChannel"/> 
    <int:channel id="messageOutputChannel"/> 

    <int:transformer input-channel="messageInputChannel" output-channel="jsonInputChannel" ref="messageToJsonObjectConverter" method="jsonFromString" /> 
    <bean id="messageToJsonObjectConverter" class="SpringMessaging.stringtoJsonObject" /> 

    <int:service-activator input-channel="jsonInputChannel" output-channel="jsonOutputChannel" ref="jsonObjectTransformer" method="improve" /> 
     <bean id="jsonObjectTransformer" class="SpringMessaging.MessageImprover" /> 

    <int:object-to-string-transformer input-channel="jsonOutputChannel" output-channel="messageOutputChannel" /> 

</beans> 

完全なスタックトレース:

java.lang.NoSuchMethodError: 
org.springframework.messaging.MessageHandlingException: method <init>(Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found 
at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:96) 
at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:89) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) 
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44) 
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:358) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:269) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:186) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) 
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44) 
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92) 
at org.springframework.integration.endpoint.MessageProducerSupport.sendMessage(MessageProducerSupport.java:188) 
at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter.access$1100(AmqpInboundChannelAdapter.java:56) 
at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.processMessage(AmqpInboundChannelAdapter.java:246) 
at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:203) 
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:822) 
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:745) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:97) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:189) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1276) 
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:726) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1219) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1189) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1500(SimpleMessageListenerContainer.java:97) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1421) 
at java.lang.Thread.run(Thread.java:748) 
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer run 
SEVERE: Stopping container from aborted consumer 
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer doShutdown 
INFO: Waiting for workers to finish. 
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer doShutdown 
INFO: Successfully waited for workers to finish. 

完全なスタックトレースを私はThrowableのVを置く場合「改善」の引数:

Exception in thread "main" 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ConsumerEndpointFactoryBean#2': Cannot resolve reference to bean 'org.springframework.integration.config.ServiceActivatorFactoryBean#0' while setting bean property 'handler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ServiceActivatorFactoryBean#0': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Target object of type [class SpringMessaging.MessageImprover] has no eligible methods for handling Messages. 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:742) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
at SpringMessaging.Main.main(Main.java:15) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.springframework.integration.config.ServiceActivatorFactoryBean#0': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Target object of type [class SpringMessaging.MessageImprover] has no eligible methods for handling Messages. 
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175) 
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1634) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) 
... 15 more 

それも中に引数としてのThrowableを置くために私を求めている理由私は理解していません"改善する"方法。何か案は?

答えて

0
java.lang.NoSuchMethodError: 
org.springframework.messaging.MessageHandlingException: method <init>(Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found 

このStackTraceの下には、causeがあるはずです。言い換えれば、あなたは全体の画像を表示しません。

2番目のケースはクリアです。

Frameworkはパラメータは今後のメッセージに​​のために治療どの方法を理解することはできません
JSONObject improve(JSONObject object, Throwable e) 

:あなたは次のように署名を持っています。

NoSuchMethodErrorservice-activatorの定義とは関係ありません。下流には何かがあります。

+1

こんにちはArtem、ありがとうございました!私はtry-catchを使ってより詳細なスタックトレースを出力し、実際の問題は変数の命名であることを知りました。 – arsenal11

関連する問題