Spring Boot - 从application.yml </enum,class>注入map <enum,class>

时间:2014-10-27 03:50:47

标签: initialization yaml spring-boot

我在J2SE app中使用spring boot。

我有一些常量数据,例如地图,表示HandlerClass处理一个操作类型。

地图关系没有改变,所以我想在application.yml

中配置它

我试试这个:

info:
  modify_nodeip: omm.task.impl.ModifyNodeIpHandler

但地图只能被识别为Map<String,String>,如何将地图注入Map<Enum,Class>

谢谢!

更新: 我跟着@cfrick指令,但它不起作用。

application.yml

config:
    optHandlerMap:
        modify_oms_nodeip: 'omm.task.opthandler.impl.ModifyOMSNodeIpHandler'

TestConfiguration:

@Configuration
@ConfigurationProperties(prefix = "config")
public class TestConfiguration
{

    Map<OperationType,OptHandler> optHandlerMap; // here we store the handlers, same name in yaml
    TestConfiguration() {}

}

并且主要功能使用了配置

@Autowired
private TestConfiguration testConfiguration;
那有什么不对?但它不起作用,optHandlerMap中的testConfiguration为空。

3 个答案:

答案 0 :(得分:3)

你可以像这样玩耍:

TestConfiguration中,定义Map<String,String>和getter。

然后提供Map<Operator,Handler> getXXXX()函数,在此函数中,将Map<String,String>转换为Map<Operator,Handler>

也许您需要将反射用于新实例。

顺便说一句,您可以在Guava中使用Maps.transform()来执行转换。

答案 1 :(得分:0)

您编写自己的设置并注释为@ConfigurationProperties(请参阅21.6 Typesafe Configuration Properties

@Component
@ConfigurationProperties(prefix="cfg") // the root in my yaml
class HandlerConfiguration {
    public enum Handler { Handler1, Handler2 } // enum 
    Map<Handler,Class> handlers // here we store the handlers, same name in yaml
    HandlerConfiguration() {}
}

然后我的application.yaml看起来像这样:

cfg:
  handlers:
    Handler1: 'app.Handler1'

像这样访问它:

def ctx = SpringApplication.run(Application, args)
ctx.getBean(HandlerConfiguration).with{
    assert handlers.size()==1 // there is the one
    assert handlers[HandlerConfiguration.Handler.Handler1] // it's key is the enum
    assert handlers[HandlerConfiguration.Handler.Handler1] == Handler1 // its value is the actual class
    handlers[HandlerConfiguration.Handler.Handler1].newInstance().run()
}

app.Handler1只是我放在那里的一些随机类,所有这些都在同一个包中(app))

答案 2 :(得分:0)

只需启用配置 spring.data.rest.enable-enum-translation (Spring document) 和 Spring 会做的伎俩