簡體   English   中英

注入不適用於嵌套對象[Jersey 2.22.1]

[英]Inject not working for nested objects[Jersey 2.22.1]

我有一個注入了Facade對象的Jersey資源。 這是在我的ResourceConfig配置的,並且外觀得到了很好的注入。 外觀包含一個DAO類,該類也應注入並在同一ResourceConfig配置。 現在到我的問題; DAO類為null。 因此,不注射。

@ApplicationPath("/service")
public class SystemSetup extends ResourceConfig {

public SystemSetup() {
    packages(false, "com.foo.bar");
    packages("org.glassfish.jersey.jackson");
    register(JacksonFeature.class);

    final LockManager manager = getLockManager();
    final SessionFactory sessionFactory = getSessionFactory();
    register(new AbstractBinder() {
        @Override
        protected void configure() {
            bindFactory(InjectFactory.getDaoFactory(sessionFactory)).to(Dao.class).in(Singleton.class);
            bindFactory(InjectFactory.getFacadeFactory(manager)).to(Facade.class).in(Singleton.class);
        }
    });
}

 @Path("/")
 @Produces("text/json")
 public class ViewResource {

    @Inject
    private Facade logic;

public class Facade {

    @Inject
    private Dao dao; //Not injected

工廠實例非常簡單。 他們只是調用構造函數並將參數傳遞給它。

奇怪的是,當我使用bind(Class object)而不是bindFactory時,這絕對可以正常工作。

編輯

工廠工廠

class InjectFactory {

    static Factory<Dao> getDaoFactory() {
        return new Factory<Dao>() {
            @Override
            public Dao provide() {
                return new Dao(new Object());
            }

            @Override
            public void dispose(Dao dao) {}
        };
    }

    static Factory<Facade> getFacadeFactory() {
        return new Factory<Facade>() {

            @Override
            public Facade provide() {
                return new Facade();
            }

            @Override
            public void dispose(Facade facade) {}
        };
    }
}

與大多數Di框架一樣,當您自己開始實例化事物時,通常是將框架排除在等式之外。 這適用於Factory實例以及工廠創建的對象。 因此,除了將Facade實例注入資源類之外,它再也不會與框架接觸。

您可以持有ServiceLocator ,如果要自己創建對象,則可以自己顯式注入對象。 這里有幾個選擇。

1)將ServiceLocator注入Factory實例,然后注入Facade實例。

static Factory<Facade> getFacadeFactory() {
    return new Factory<Facade>() {

        @Context
        ServiceLocator locator;

        @Override
        public Facade provide() {
            Facade facade = new Facade();
            locator.inject(facade);
            return facade;
        }

        @Override
        public void dispose(Facade facade) {}
    };
}

@Inject
public SystemSetup(ServiceLocator locator) {
    packages("foo.bar.rest");
    packages("org.glassfish.jersey.jackson");
    register(JacksonFeature.class);

    register(new AbstractBinder() {
        @Override
        protected void configure() {
            bindFactory(InjectFactory.getDaoFactory()).to(Dao.class);

            Factory<Facade> factory = InjectFactory.getFacadeFactory();
            locator.inject(factory);
            bindFactory(factory).to(Facade.class);
        }
    });
}

2)或綁定Factory ,然后讓框架注入ServiceLocator

public static class FacadeFactory implements Factory<Facade> {

    @Context
    ServiceLocator locator;

    @Override
    public Facade provide() {
        Facade facade = new Facade();
        locator.inject(facade);
        return facade;
    }

    @Override
    public void dispose(Facade facade) {}
}

register(new AbstractBinder() {
    @Override
    protected void configure() {
        bindFactory(InjectFactory.getDaoFactory()).to(Dao.class);
        bindFactory(InjectFactory.FacadeFactory.class).to(Facade.class);
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM