在Spring Integration注释配置中没有@MessageEndpoint的@ServiceActivator

时间:2016-11-23 11:16:44

标签: spring spring-integration spring-java-config

我正在尝试将替换xml配置用于基于java / annotation的配置,用于具有Spring Integration(版本4.0.6)的简单tcp服务器。 我使用@MessageEndpoint让它工作如下。问题是由于某种原因,使用@MessageEndpoint注释的类必须是静态的。我不能在其中注入豆子,因为这样可以做一些有用的事情。 根据我的理解,应该可以使用没有@MessageEndpoint的@ServiceActivator,但我无法弄清楚如何。

这就是我现在所拥有的。在评论中,您可以看到我试图替换的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 个答案:

答案 0 :(得分:1)

Bean类必须是静态类或顶级类。

静态类是可以的,但你必须声明一个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