2016-11-23 62 views
0

我想要使用替換xml配置Java /註釋基於一個簡單的tcp服務器與Spring集成(版本4.0.6)。 我使用@MessageEndpoint按如下方式工作。問題是,由於某些原因,使用@MessageEndpoint註解的類必須是靜態的。我無法注入bean,因爲這樣做有用。 據我所知,應該可以使用@ServiceActivator而不使用@MessageEndpoint,但我無法弄清楚。@ServiceActivator沒有@MessageEndpoint在Spring集成註釋配置

這是我現在所擁有的。在評論中你可以看到我想要替換的xml部分。

@Configuration 
@EnableIntegration 
public class TcpServerContextConfiguration { 
// <int-ip:tcp-connection-factory id="crLfServer" 
// type="server" 
// port="5678" 
// single-use="true" 
// so-timeout="10000"/> 

    @Bean 
    TcpNetServerConnectionFactory crLfServer() { 
     TcpNetServerConnectionFactory factory = new TcpNetServerConnectionFactory(5678); 
     factory.setSingleUse(true); 
     factory.setSoTimeout(10000); 
     return factory; 
    } 

// <int-ip:tcp-inbound-gateway id="gatewayCrLf" 
// connection-factory="crLfServer" 
// request-channel="serverBytes2StringChannel"/> 

    @Bean 
    public TcpInboundGateway gatewayCrLf() { 
     TcpInboundGateway gateway = new TcpInboundGateway(); 
     gateway.setConnectionFactory(crLfServer()); 
     gateway.setRequestChannel(serverBytes2StringChannel()); 
     return gateway; 
    } 

    @Bean 
    public MessageChannel serverBytes2StringChannel() { 
     return new DirectChannel(); 
    } 

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

    @Bean 
    public MessageChannel toSA() { 
     return new DirectChannel(); 
    } 

// <int:service-activator input-channel="toSA" 
// ref="echoService" 
// method="test"/> 
// 
// <bean id="echoService" 
// class="com.posera.www.poseraStats.site.EchoService" /> 

    @MessageEndpoint 
    public static class Echo { 

     @ServiceActivator(inputChannel="toSA") 
     public String echoService(String req) { 
      return "echo:" + req; 
     } 
    } 


// <int:object-to-string-transformer id="serverBytes2String" 
// input-channel="serverBytes2StringChannel" 
// output-channel="toSA"/> 

    @Bean 
    @Transformer(inputChannel="serverBytes2StringChannel", outputChannel="toSA") 
    public org.springframework.integration.transformer.Transformer serverBytes2String() { 
     return new ObjectToStringTransformer(); 
    } 
} 

所以我試圖用@MessageEndpoint下面的代碼,但它失敗:

@ServiceActivator(inputChannel="toSA") 
public String echoService(String req) { 
    return "echo:" + req; 
} 

我想我在尋找應該是這樣的答案:

@Bean 
@ServiceActivator(inputChannel="toSA") 
public MessageHandler newEchoService() { 
} 

但我我不知道在這個時候我需要使用哪個MessageHandler接口實現輸入通道,它是String。

在此先感謝。

回答

1

Bean類必須是靜態或頂級類。

靜態類都OK,但你要聲明一個bean實例自動裝配或注入其他bean到實例...

@Bean Foo foo() { 
    return new Foo(); 
} 

public static class Foo { 

    @Autowired 
    private Bar bar; 

    ... 
} 

或者,如果你註釋你的TcpServerContextConfiguration@MessageEndpoint,你可以只使用@ServiceActivator風格沒有@Bean。如果升級到4.3.x(當前爲4.3.5),則在課程級別不再需要@MessageEndpoint

+0

嗨加里,非常感謝這麼快速的回答。我有一種感覺,你會回答它:) – Yerke

+0

添加'@ MessageEndpoint'到TcpServerContextConfiguration幫助。非常感謝。但是爲了我將來的理解:如問題中所述,是否有一種方法可以使用不帶'@ MessageEndpoint'的'@ ServiceActivator'? – Yerke

+1

正如我所說的,從@ 4.3開始不再需要'@ MessageEndpoint'。在此之前,它是POJO'@ ServiceActivator'所必需的; '@ServiceActivator'的@ Bean風格必須是'MessageHandler'類型。要使用這種風格,你應該繼承'AbstractReplyProducingMessageHandler'並實現'handleRequestMessage()'。輸出通道需要在處理程序中指定,而不是在@ @ ServiceActivator中指定。有兩個bean,消費者端點和處理程序。請參閱[文檔](http://docs.spring.io/spring-integration/reference/html/configuration.html#annotations_on_beans)。 –

相關問題