当前位置: 首页 > 知识库问答 >
问题:

使用自定义hk2 InjectionResolver注入应用程序配置

阴靖
2023-03-14
public class MyApplication extends ResourceConfig {
    ...
    packages(MY_PACKAGES);
    property(MY_CONFIG_PROPERTY, someValue);
    register(new AbstractBinder() {
        @Override
        protected void configure() {
            bind(ConfigurationInjectionResolver.class)
            .to(new TypeLiteral<InjectionResolver<Named>>(){})
            .in(Singleton.class)
        }
    });
}

然后我的InjectionResolver看起来像

public class ConfigurationInjectionResolver implements InjectionResolver<Named> {
    @Context Application application;

    @Override
    public Object resolve(Injectee injectee, ServiceHandle<?> serviceHandle) {
        // lookup data in application.getProperties();
    }
}

我的问题是application.getProperties()为空。知道怎么了吗?另外,我可以绑定我的注入器的实例而不是绑定类吗?这样,我就可以构造将map数据作为参数传递的实例。

共有1个答案

沃侯林
2023-03-14

“我的问题是Application.getProperties()是空的,知道出了什么问题吗?

不,这对我来说很管用。

public class ConfigurationInjectionResolver implements InjectionResolver<Named> {  
    @Context
    Application application;

    @Override
    public Object resolve(Injectee injectee, ServiceHandle<?> root) {
        Named annotation = injectee.getParent().getAnnotation(Named.class);
        Map<String, Object> props = application.getProperties();
        String name = annotation.value();
        System.out.println(props.get(name));
        return props.get(name);
    }

    @Override
    public boolean isConstructorParameterIndicator() { return false; }
    @Override
    public boolean isMethodParameterIndicator() { return false; }  
}

@ApplicationPath("/rest")
public class JerseyApplication extends ResourceConfig {

    public JerseyApplication() {
        packages("jersey.startup.test");
        property("hello.config", "Hello World Property");
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(ConfigurationInjectionResolver.class)
                        .to(new TypeLiteral<InjectionResolver<Named>>() {
                        }).in(Singleton.class);
            }
        });
    }
}

资源

@Path("/config")
public class ConfigResource {

    @Named("hello.config")
    String hello;

    @GET
    public Response getHello() {
        return Response.ok(hello).build();
    }
}
<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2-configuration-hub</artifactId>
    <version>${hk2.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2-configuration-integration</artifactId>
    <version>${hk2.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2-property-file</artifactId>
    <version>${hk2.version}</version>
</dependency>
@ApplicationPath("/rest")
public class JerseyApplication extends ResourceConfig {

    @Inject
    public JerseyApplication(ServiceLocator locator) {
        packages("jersey.startup.test");
        ServiceLocatorUtilities.addClasses(locator, ConfigResource.class);
        try {
            loadConfigurationProperties(locator);
        } catch (IOException ex) {
            Logger.getLogger(JerseyApplication.class.getName())
                                   .log(Level.SEVERE, null, ex);
        }
    }

    private void loadConfigurationProperties(ServiceLocator locator) 
                                                 throws IOException {
        ConfigurationUtilities.enableConfigurationSystem(locator);
        PropertyFileUtilities.enablePropertyFileService(locator);
        PropertyFileService propertyFileService 
                = locator.getService(PropertyFileService.class);
        Properties props = new Properties();
        URL url = getClass().getResource("/configuration.properties");
        props.load(url.openStream());
        PropertyFileHandle propertyFileHandle 
                = propertyFileService.createPropertyHandleOfAnyType();
        propertyFileHandle.readProperties(props);
    }
}

配置.属性

AppConfiguration.App.hello=Hello Squirrel Property!

资源

@Path("/config")
@ConfiguredBy("AppConfiguration")
public class ConfigResource {

    @Configured
    String hello;

    @GET
    public Response getHello() {
        return Response.ok(hello).build();
    }
}

C:\>curl http://localhost:8080/test/rest/config
Hello Squirrel属性!

ServiceLocatorUtilities.addClasses(locator, ConfigResource.class);
 类似资料:
  • 问题内容: 对我先前的问题采取了后续行动。我正在尝试使用JSR-330标准注释和jersey捆绑的HK2框架注入应用程序配置数据。 理想情况下,我想为注释创建一个自定义,该自定义将在或对象中查找所需的值,该值将从其他地方读取的数据中填充。在我的第一次尝试中,我创建了一个实例,例如 然后我的模样 我的问题是那是空的。知道有什么问题吗?另外,我可以绑定我的Injector实例而不是绑定类吗?这样,我可

  • 问题内容: 主要问题-可能吗?我没有运气就尝试了.. 主app.js 提供者本身 而且我有这样的错误: 有任何想法吗? 谢谢! 问题答案: 您 不能 将服务注入提供者配置部分。 您 CAN 注入服务成初始化提供者的服务的部分。 细节: Angular框架有两个阶段的初始化过程: 阶段1:配置 在此阶段,将初始化所有提供程序,并执行所有部分。这些部分可能包含配置提供程序对象的代码,因此可以将它们与提

  • 我正在基于Dropwizard v0.9.1构建一个web堆栈。堆栈中的所有日志都通过AppenderFactory接口的自定义实现发送到Loggly: 此类未在我的应用程序类中的环境中注册。相反,它似乎是Dropwizard基于@JsonTypeName注释自动连接的。尽管如此,和字段由出现在我的配置yaml文件中的值填充: 问题是,这些配置值不会出现在应用程序的配置类中,这意味着在构建其他资源

  • 我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得

  • 问题是,就应用程序生命周期处理和易于使用而言,这种体系结构是否可以被认为是安全的? Update:每次创建新的活动并希望获得数据时,它可以获得ApplicationContext的BehaviorSubject,然后订阅它,Subject将发出最后发出的值;我为什么要这样做?例如。假设你有新闻项目,你获取了新闻提要,你想启动后台任务来获取新闻项目的全部内容,在这种情况下,我可以在你滚动新闻列表时开

  • 目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?