如何在 yml 中获取我的配置值 - 使用 dropwizard(微服务)Jersey D.I @Injection?
这是我的代码片段.
这是我的 yml 文件:
here's my yml file:
productionServer:
host: production-server.amazonaws.com
publicIp: xx.xx.xx.xx
privateIp: xx.xx.xx.xx
userName: xx.xx.xx.xx
password: xx.xx.xx.xx
remoteFilePath: fake/path/
fileName: test.txt
privateKey: private-public-key.ppk
server:
applicationConnectors:
- type: http
port: 8080
- type: https
port: 8443
keyStorePath: key.keystore
keyStorePassword: password
validateCerts: false
adminConnectors:
- type: http
port: 8081
- type: https
port: 8444
keyStorePath: key.keystore
keyStorePassword: password
validateCerts: false
MyConfiguration 类:
MyConfiguration class:
import io.dropwizard.Configuration;
public class MyConfiguration extends Configuration{
@NotNull
@JsonProperty
private ProductionServer productionServer;
// getters
public class ProdctionServer{
@NotEmpty
@JsonProperty
private host;
@NotEmpty
@JsonProperty
private publicIp;
// getters
应用类:
import io.dropwizard.Application;
public class MyApplication extends Application<MyConfiguration> {
public static void main(String[] args) throws Exception{
new MysApplication().run(args);
}
@Override
public String getName(){ return "micro-service"; }
@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap){}
@Override
public void run(MyConfiguration conf, Environment environment ){
final MyResource myResource = new MyResource();
// health check
// environment.healthChecks().register("template",healthCheck);
System.out.println( "==> " + conf );
System.out.println( "==> " + conf.getProductionServer() );
// register
environment.jersey().register( MyResource );
在运行此应用程序时:
我收到如下记录:
==> MyConfiguration{server=DefaultServerFactory{applicationConnectors=[io.dropwizard.jetty.HttpConnectorFactory@623e088f, io.dropwizard.jetty.HttpsConnectorFactory@39fcbef6], adminConnectors=[io.dropwizard.jetty.HttpConnectorFactory@34f22f9d, io.dropwizard.jetty.HttpsConnectorFactory@77d67cf3], adminMaxThreads=64, adminMinThreads=1, applicationContextPath=/, adminContextPath=/}, logging=DefaultLoggingFactory{level=INFO, loggers={}, appenders=[io.dropwizard.logging.ConsoleAppenderFactory@663411de]}}
==> com.mycompany.myproject.model.ProductionServer@5b04476e
意味着它成功获取了我的 yaml 的值.但我的问题是在 MyConfiguration 类的 D.I 或依赖注入期间.尽管我的服务中的 Object MyConfiguration 似乎不为空,但我无法获取我的 ProductionServer 的值.
meaning it is successfully gets the value of my yaml. but my problem is during the D.I or dependency injection of MyConfiguration class. i cannot get the value of my ProductionServer though the Object MyConfiguration seems not null in my Service.
这是我绑定 MyService.class 和 MyConfiguration.class 的依赖项的代码片段
here's my code snippet of dependency binding the MyService.class and the MyConfiguration.class
DependencyBinder.class
DependencyBinder.class
导入 org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
公共类 DependencyBinder 扩展 AbstractBinder {
public class DependencyBinder extends AbstractBinder {
@Override
protected void configure() {
bind(MyConfiguration.class).to(MyConfiguration.class);
bind(MyService.class).to(MyService.class);
}
MyService.class
MyService.class
public class MyService {
@Inject
MyConfiguration conf;
public void invoke(){
System.out.println( "=============================== " );
System.out.println( "==> " + conf );
System.out.println("==> " + conf.getProductionServer() );
}
在调用方法invoke()的过程中...我得到了如下记录:
and during the invoking of the method invoke()... i got a logged as follows:
===============================
==> MyConfiguration{server=DefaultServerFactory{applicationConnectors=[io.dropwizard.jetty.HttpConnectorFactory@34e82c4d], adminConnectors=[io.dropwizard.jetty.HttpConnectorFactory@19b70fbd], adminMaxThreads=64, adminMinThreads=1, applicationContextPath=/, adminContextPath=/}, logging=DefaultLoggingFactory{level=INFO, loggers={}, appenders=[io.dropwizard.logging.ConsoleAppenderFactory@543f81c9]}}
==> null
现在我的问题是在 MyService.class 中的 MyConfiguration 类的 D.I 或依赖注入期间.尽管我的服务中的 Object MyConfiguration 似乎不为空,但我无法获取我的 ProductionServer 的值.请给我一些解决方案?谢谢.
now my problem is during the D.I or dependency injection of MyConfiguration class in MyService.class. i cannot get the value of my ProductionServer though the Object MyConfiguration seems not null in my Service. please give me some resolution? thnx.
推荐答案
问题是,这个配置
bind(MyConfiguration.class).to(MyConfiguration.class);
HK2 将创建 MyConfiguration
的新实例.它不会是 DW 填充的同一个实例.但是,您可以做的是使用 DW 创建的实例,只需在 HK2 配置中绑定 相同的实例
HK2 will create a new instance of the MyConfiguration
. It will not be the same instance populated by DW. What you can do though, is use the instance created by DW, by simply binding that same instance in your HK2 configuration
public class MyApplication extends Application<MyConfiguration> {
@Override
public void run(final MyConfiguration config, Environment env) {
env.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bind(config).to(MyConfiguration.class);
}
});
}
}
相关文章