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

泽西测试+HK2+注塑工厂服务

淳于升
2023-03-14

我试图在Jersey测试类中注入一个由HK2工厂服务提供的对象,但得到未满足的依赖项异常。

    public class TestFactory implements Factory<TestObject>{

        private final CloseableService closeService;

        @Inject
        public TestFactory(CloseableService closeService) {
            this.closeService = closeService;
        }

        @Override
        public TestObject provide() {
            TestObject casualObject = new TestObject();
            this.closeService.add(() -> dispose(casualObject));
            return casualObject;
        }

        @Override
        public void dispose(TestObject instance) {
            instance.destroy();
        }
    }
    public class SampleTestCass extends JerseyTestNg.ContainerPerClassTest
    {

      //@Inject
      private TestObject myTestObject;

      private ServiceLocator locator;


     @Override
        protected Application configure()
        {
            ResourceConfig resConfig = new ResourceConfig(MyApi.class);
            resConfig.register(getBinder());
            locator = setupHK2(getBinder());

            return resConfig;
        }

        // setup local hk2
        public setupHK2(AbstractBinder binder) 
        {
            ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance();
            ServiceLocator locator = factory.create("test-locator");

            DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
            DynamicConfiguration dc = dcs.createDynamicConfiguration();

            locator.inject(binder);
            binder.bind(dc);
            dc.commit();
            return locator;
        }

        // get the binder
        public AbstractBinder getBinder()
        {
        return new AbstractBinder() {
                @Override
                protected void configure() {
                    bindFactory(TestFactory.class, Singleton.class).to(TestObject.class).in(PerLookup.class);
                }

            }
        }

         @BeforeClass
        public void beforeClass()
        {
            myTestObject = locator.getService(TestObject.class);

            // use myTestObject
        }

         @AfterClass
        public void afterClass()
        {
            if (locator != null) {
                locator.shutdown();
            }
        }

        @Test()
        public void someTest()
        {
            // some test code...
        }

    }

MultiException有3个异常。它们是:

  1. org.glassfish.hk2.api.unsatifiedDependencyException:在SystemInjecteeImpl(requiredtype=closeableService,parent=TestFactory,qualifiers={},position=0,optional=false,self=false,unqualified=null,2053349061)
  2. java.lang.IllegalArgumentException:试图解析com.test.factories.TestFactory的依赖项时发现错误
  3. java.lang.IllegalStateException:无法执行操作:在com.test.factories.testFactory上解析

共有1个答案

秦钟展
2023-03-14

CloseableService是Jersey应用程序中可用的服务。您创建的ServiceLocator没有绑定到Jersey应用程序。它只是一个独立的定位器。因此,尝试用此定位器注册TestFactory将导致失败,因为没有CloseableService。您在ResourceConfig中注册的代码可以正常工作。

不确定您到底想要做什么,但是如果您想要访问测试中的服务,可以做的一件事就是将服务绑定为实例,类似于

class MyTest {
    private Service service;

    @Override
    public ResourceConfig configure() {
        service = new Service();
        return new ResourceConfig()
            .register(new AbstractBinder() {
                @Override
                public void configure() {
                    bind(service).to(Service.class);
                }
            })
    }
}
 类似资料:
  • 我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并

  • 当我尝试在任何一点使用定位器时,我仍然无法创建我使用locator.create(mything.class)方法在AbstractBinder中注册的东西的实例。 我确信它们是正确绑定的,因为它们通过@inject字段注释被正确地注入到我的资源类中。 不同的是,Jersey/HK2框架正在实例化我的资源类(正如预期的那样,因为它们在我的包扫描路径中),但我似乎无法通过代码来利用ServiceLo

  • 我已经设法在Jersey,HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上遵循了这个例子。) 我现在很好奇将JPA EntityManager注入我的资源类中的最佳方法是什么?(我目前正在考虑一个请求作为一个工作单元)。我目前正在研究的一个选项是以以下方式使用: null (我不想仅仅为了覆盖这个用例而依赖于重量级容器或额外的依赖注入库。)

  • 我试图在一个预构建项目中设置Swagger Swagger UI,该项目既不使用泽西2容器Servlet,也不使用官方文档中所述的过滤器配置(带web.xml)。 我的主类是这样的: 我想使用包扫描和Swagger用户界面来跟踪我的应用编程接口。我找到的所有答案都说你应该扩展类,或者使用带有文件的过滤器配置。请给我一个提示,告诉我如何将Swagger添加到给我的现有项目中。 我是新来JAX的,有点

  • 在我的应用程序中,我需要根据用户输入获得不同的实现。 到目前为止,我所做的只是通过在启动时使用和绑定到实现的接口注入服务: 然而,现在我需要根据用户输入动态获取一个实现。有25种不同的实现都使用相同的接口。 这意味着,我不能再简单地使用方法。相反,我认为我需要用单独注册它们。 我需要来自HK2的实例,因为Impl也使用注入的服务,所以我不能简单地创建一个新的实例。

  • 这是我为我的HTTPServer编写的内容: 任何帮助都将不胜感激。