2015-08-13 41 views
2

我現在正在使用Spring Integration與我的項目,特別是MessageChannel/PublishSubscribeChannel。我想要實現的是創建代理模塊,以便系統的其他部分可以調用此模塊將消息發送到特定的MessageChannel。嵌套注入造成的Bean鑄造錯誤

這裏就是我的經紀人模塊現在做的:

@Configuration 
public class BrokerConfiguration { 
    @Bean 
    public MessageChannel brokerChannel1() { 
    return new PublishSubscribeChannel(); 
    } 
} 

和:

@Component 
public class BrokerA { 
    @Autowired 
    @Qualifier("brokerChannel1") 
    public MessageChannel messageChannel; 

    public void sendAMessage() { 
    messageChannel.send(MessageBuilder.withPayload("This is a message!").build()); 
    } 
} 

我已經創建代理模塊內的SpringBootApplication解決此設置發揮它似乎工作得很好。然而,當我嘗試使用它在我的系統中像這樣的不同的模塊:

@Autowired 
private BrokerA brokerA; 

public void doSomethingHere() { 
    brokerA.sendAMessage(); 
} 

我得到這樣一個ClassCastException:

java.lang.ClassCastException: org.springframework.integration.channel.PublishSubscribeChannel cannot be cast to org.springframework.messaging.MessageChannel 

當我在BrokerA改變messageChannel到的類型PublishSubscribeChannel,它會抱怨PublishSubscribeChannel沒有一個叫做send()的方法。

這真讓我感到困惑。任何建議或意見?謝謝!

回答

1

在類路徑中有一個Spring Integration的舊版本;在Spring 4.0中,MessageChannel等已從o.s.integration...移至o.s.messaging

您需要使用Spring Integration 4.x.

+0

這完全正確!謝謝! –

+0

我有另一個取決於sprint-integration-core 3.x的maven依賴項,並且沒有更新。你有什麼建議來處理這種情況? –

+1

對於任何事情你都必須回去(重寫引導的依賴關係)到Spring Integration 3.0.x,但啓動啓動器/自動配置的東西不太可能用於任何SI組件。取決於你在做什麼,你可能不得不退回到Spring Framework 3.x,這可能完全排除引導。您可以考慮在不同的類加載器中加載該jar,並提供一個shim將消息從一個類轉換爲另一個類(並再次返回)。 –

1

檢查你的類路徑,可能你有重複的罐子。

+0

我用Tattletale掃描,但似乎沒有任何重複的罐子。 :/ –

0

我跑你的我與去年春季啓動版本環境的代碼沒有關於春天的任何版本的規範,它的工作剛剛好,唯一的錯誤是

MessageBuilder.withPayload("This is a message!")應該MessageBuilder.withPayload("This is a message!").build()

而且我驗證了使用org.springframework.integration.support.MessageBuilder

+0

嗨!感謝您的嘗試。我在專用服務器內也嘗試過它,並沒有遇到任何問題。我認爲這個問題在自動裝配不同模塊中的經紀人類中存在。 –

0

嘗試在BrokerConfiguration的brokerChannel1()的return語句中進行顯式強制轉換。

+0

不幸的是,這並沒有幫助。 –