如何在yml中获取我的配置值 - 使用dropwizard(microservice)Jersey D.I @Injection? [英] how to get my configuration values in yml - using dropwizard (microservice) Jersey D.I @Injection?
问题描述
这是我的代码片段。
这是我的yml文件:
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值。
但我的问题是在D.I或MyConfiguration类的依赖注入期间。虽然在我的服务中Object MyConfiguration似乎不为null,但我无法获得我的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
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
public class DependencyBinder extends 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()期间...
i记录如下:
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中MyIffiguration类的D.I或依赖注入期间。虽然在我的服务中Object MyConfiguration似乎不为null,但我无法获得我的ProductionServer的值。
请给我一些解决方案? thnx。
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);
}
});
}
}
这篇关于如何在yml中获取我的配置值 - 使用dropwizard(microservice)Jersey D.I @Injection?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!