2

Google Guice を使用して事前定義されたインターセプターにサービスを注入する際に問題があります。

私がやろうとしているのはemptyinterceptor、エンティティの変更を傍受するために使用することです。インターセプター自体は正常に動作しますが、問題は、サービスを注入する方法がわからないことです。インジェクション自体は、アプリケーション全体で正常に機能します。

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="db-manager">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>test.Address</class>
    <properties>
        <property name="hibernate.ejb.interceptor" value="customInterceptor"/>
    </properties>
</persistence-unit>

どうやって注射しようとしているのか

public class CustomInterceptor extends EmptyInterceptor {

private static final Logger LOG = Logger.getLogger(CustomInterceptor.class);

@Inject
private Provider<UploadedFileService> uploadedFileService;
...
}

JpaPersistModule の開始方法

public class GuiceListener extends GuiceServletContextListener {

private static final Logger LOG = Logger.getLogger(GuiceListener.class);

@Override
protected Injector getInjector() {
    final ServicesModule servicesModule = new ServicesModule();
    return Guice.createInjector(new JerseyServletModule() {
        protected void configureServlets() {

            // db-manager is the persistence-unit name in persistence.xml
            JpaPersistModule jpa = new JpaPersistModule("db-manager");

                            ...
                    }
            }, new ServicesModule());
     }
}

サービスの開始方法

public class ServicesModule extends AbstractModule {

@Override
protected void configure() {
    bind(GenericService.class).to(GenericServiceImpl.class);
    bind(AddressService.class).to(AddressServiceImpl.class);
}
}
4

1 に答える 1

3

何時間も検索しましたが、実際の解決策が見つかりませんでした。そのため、私が使用している醜い回避策は、2 つのインターセプターを作成することです。

最初のものは休止状態によって正しくバインドされていますが、何も注入されていません。以下の例では、 InjectorFactoryへの静的参照を介して、他のメカニズムを介して 2 番目のインターセプターを呼び出します。2 番目のインターセプターは Hibernate にバインドされていませんが、他のクラスと同様に、喜んで何かを注入することができます。

//最初のインターセプタには次のようなメソッドがあります...

@Override
  public synchronized void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
  InjectorFactory.getInjector().getInstance(MyOtherInterceptor.class).onDelete(entity, id, state, propertyNames, types);
}

d

// 2 番目のものには実際の実装があります

@Inject
public MyOtherInterceptor() {
}

@Override
public synchronized void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
  //Full implementation
}
//etc
于 2014-08-13T09:06:37.447 に答える