Spring 集成注释配置中没有@MessageEndpoint 的@ServiceActivator

@ServiceActivator without @MessageEndpoint in Spring Integration annotation config

我正在尝试将 xml 配置替换为基于 java/annotation 的配置,用于具有 Spring 集成(版本 4.0.6)的简单 tcp 服务器。 我使用@MessageEndpoint 使其工作如下。问题是由于某种原因,用@MessageEndpoint 注释的 class 必须是静态的。我不能在其中注入 bean 来做一些有用的事情。 据我了解,应该可以在没有@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。

提前致谢。

Bean classes 必须是静态的或顶级的 classes。

静态 classes 是可以的,但是你必须声明一个 bean 实例来自动装配或将其他 bean 注入到实例中...

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

public static class Foo {

    @Autowired
    private Bar bar;

    ...
}

或者,如果您使用 @MessageEndpoint 注释 TcpServerContextConfiguration,则可以只使用 @ServiceActivator 样式而不使用 @Bean。如果升级到 4.3.x(当前为 4.3.5),class 级别不再需要 @MessageEndpoint