我在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
为空。
答案 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 会做的伎俩