@EnableConfigurationPropertiesMyConfig.class生成的bean名称在spring-integration中不起作用

问题描述

我有一个@ConfigurationProperties的配置类,如下所示。我可以在systemConfigMap类的application.yaml中填充MyConfig,如下所示

@ConfigurationProperties(prefix = "my-config")
@ConstructorBinding
@AllArgsConstructor
public class MyConfig {

    /**
     * A Configuration Map of multiple Systems
     */
    private Map<String,SystemConfig> systemConfigMap;
    
}

主要类别为

@EnableConfigurationProperties(MyConfig.class)
public class SpringApp {
    public static void main(String[] args) {
        SpringApplication.run(SpringApp.class,args);
    }
}

问题在于生成的bean名称my-config-a.b.c.config.MyConfig,我猜不能在payload-expression的{​​{1}}中使用它,因为它里面有“-”。 / p>

如何为生成的bean spring integration http inbound gateway指定bean名称

编辑:HTTP网关配置

MyConfig

我想在请求 <int:channel id="myConfigListChannel" /> <int-http:inbound-gateway request-channel="myConfigListChannel" path="/data" error-channel="errorChannel" supported-methods="GET" payload-expression="@my-config-a.b.c.config.MyConfig.getSystemConfigMap().values()" /> 开始处理流程时加载systemConfigMap的值。

解决方法

当您尝试在SpEL表达式中使用像my-config-a.b.c.config.MyConfig这样的复杂bean id时,需要将其包装为文字。否则,它将直到第一个.之前都知道一个id,该id被视为以前对可能的bean进行评估的方法/属性引用。 因此,它尝试找到像my-config-a这样的bean,然后尝试访问其b属性,在您的情况下这完全是错误的。

要解决您的问题,您需要这样做:

 payload-expression="@'my-config-a.b.c.config.MyConfig'.systemConfigMap.values()"

另一种技巧是将MyConfig注入到具有真正有意义的bean名称的bean中,并使用表达式中的那个作为委托。