2014-04-27 16 views
7

Próbuję skonfigurować hibernatebundle z guice/dropwizard i potrzebuję pomocy. Używam biblioteki innej firmy oprócz biblioteki dropwizard.jak automatycznie podłączyć HibernateBundle z guice na dropwizard?

Poniższy kod nie będzie działał i będzie potrzebował pomocy w jego ustaleniu. Jak przerobić to tak, aby hibernatebundle i ostatecznie, fabryka sesji, były automatycznie wstrzykiwane do fasoli, która tego potrzebuje.

MyApplication.java

public class MyApplication extends Application<MyAppConfiguration> { 

    private final HibernateBundle<MyAppConfiguration> hibernateBundle = new HibernateBundle<MyAppConfiguration>(MyModel.class) { 
     @Override 
     public DataSourceFactory getDataSourceFactory(MyAppConfiguration configuration) { 
      return configuration.getDataSourceFactory(); 
     } 
    }; 

    @Override 
    public void initialize(Bootstrap<MyAppConfiguration> bootstrap) { 
     bootstrap.addBundle(hibernateBundle); // ??? 

     bootstrap.addBundle(
      GuiceBundle.<MyAppConfiguration>newBuilder() 
        .addModule(new MyAppModule()) 
        .enableAutoConfig(getClass().getPackage().getName()) 
        .setConfigClass(MyAppConfiguration.class) 
        .build() 
     ); 
    } 

} 

MyAppModule.java

public class MyAppModule extends AbstractModule { 

    @Provides 
    public SessionFactory provideSessionFactory(MyAppConfiguration configuration) { 
      // really wrong as it creates new instance everytime. 
     return configuration.getHibernateBundle().getSessionFactory(); // ??? 
    } 

} 

MyAppConfiguration.java

public class MyAppConfiguration extends Configuration { 
    @Valid 
    @NotNull 
    private DataSourceFactory database = new DataSourceFactory(); 

    @JsonProperty("database") 
    public DataSourceFactory getDataSourceFactory() { 
     return database; 
    } 

    @JsonProperty("database") 
    public void setDataSourceFactory(DataSourceFactory dataSourceFactory) { 
     this.database = dataSourceFactory; 
    } 

     // ??? 
    public HibernateBundle<MyAppConfiguration> getHibernateBundle() { 
     return new HibernateBundle<MyAppConfiguration>(MyModel.class) { 
      @Override 
      public DataSourceFactory getDataSourceFactory(MyAppConfiguration configuration) { 
       return database; 
      } 
     }; 
    } 

} 
+0

Czy to stałe? Mam ten sam problem. – user1226868

Odpowiedz

5

Oto jak ja to robię. Nigdy nie otrzymałem odpowiedzi ani listy mailingowej, więc uznałbym to za hackish i prawdopodobnie nie jest to właściwy sposób, ale działa to dla mnie.

W moim modułu (który rozciąga abstractmodule):

private final HibernateBundle<MyConfiguration> hibernateBundle = 
     new HibernateBundle<MyConfiguration>(MyModel.class) { 
      @Override 
      public DataSourceFactory getDataSourceFactory(MyConfiguration configuration) { 
       return configuration.getDataSourceFactory(); 
      } 
     }; 

@Provides 
public SessionFactory provideSessionFactory(MyConfiguration configuration, 
              Environment environment) { 

    SessionFactory sf = hibernateBundle.getSessionFactory(); 
    if (sf == null) { 
     try { 
      hibernateBundle.run(configuration, environment); 
     } catch (Exception e) { 
      logger.error("Unable to run hibernatebundle"); 
     } 
    } 

    return hibernateBundle.getSessionFactory(); 
} 

poprawione:

public SessionFactory provideSessionFactory(MyConfiguration configuration, 
              Environment environment) { 

    SessionFactory sf = hibernateBundle.getSessionFactory(); 
    if (sf == null) { 
     try { 
      hibernateBundle.run(configuration, environment); 
      return hibernateBundle.getSessionFactory(); 
     } catch (Exception e) { 
      logger.error("Unable to run hibernatebundle"); 
     } 
    } else { 
     return sf; 
    } 
} 
+0

jak programowo wywołać 'hibernateBundle.run (konfiguracja, środowisko);' ponieważ nie masz instancji 'environment' dostępnej w module (która rozszerza moduł abstrakcyjny)? –

-1

nie użyłem hibernacji dropwizard, ale użyłem Guice i naprawdę tylko martwić się o MyAppModule. To miejsce, gdzie magia będzie się działo:

public class MyAppModule extends AbstractModule { 

    @Singleton 
    @Provides 
    public SessionFactory provideSessionFactory(MyAppConfiguration configuration) { 
     HibernateBundle<MyAppConfiguration> hibernate = new HibernateBundle<ExampleConfiguration>(MyModel.class) { 
      @Override 
      public DataSourceFactory getDataSourceFactory(MyAppConfiguration configuration) { 
       return configuration.getDataSourceFactory(); 
      } 
     } 

     return hibernate.getSessionFactory(); 
    } 
} 

(patrz here dla wielu klasach)

MyAppConfiguration.java i MyApplication.java nie powinna mieć żadnych odniesień hibernacji wiązek w Powinieneś być w stanie @. Wstrzyknij SessionFactory tam, gdzie jest to potrzebne.

3

Myślałem wyraźnej run (konfiguracja, środowisko) wezwanie (w odpowiedzi udzielonej przez @StephenNYC) był trochę dziwne, więc trochę głębiej. Dowiedziałem się, że AutoConfig w grze dropwizard-guice nie skonfigurował poprawnie ConfiguredBundle (taki typ HibernateBundle).

Od https://github.com/HubSpot/dropwizard-guice/pull/35 kod może teraz wyglądać tak zamiast:

@Singleton 
public class MyHibernateBundle extends HibernateBundle<NoxboxConfiguration> implements ConfiguredBundle<MyConfiguration> 
{ 
    public MyHibernateBundle() 
    { 
     super(myDbEntities(), new SessionFactoryFactory()); 
    } 

    private static ImmutableList<Class<?>> myDbEntities() 
    { 
     Reflections reflections = new Reflections("com.acme"); 
     ImmutableList<Class<?>> entities = ImmutableList.copyOf(reflections.getTypesAnnotatedWith(Entity.class)); 
     return entities; 
    } 

    @Override 
    public DataSourceFactory getDataSourceFactory(NoxboxConfiguration configuration) 
    { 
     return configuration.getMyDb(); 
    } 
} 

@Provides 
public SessionFactory sessionFactory(MyHibernateBundle hibernate) 
{ 
    return checkNotNull(hibernate.getSessionFactory()); 
} 

Magia za to, że MyHibernateBundle realizuje ConfiguredBundle który dropwizard-Guice teraz automatycznie podnosi i instancję.

+0

uhm, otrzymuję komunikat "Brak implementacji dla org.hibernate.SessionFactory." – AndacAydin

+0

brakujące informacje: ten kod musi zostać wstawiony do klasy modułu. Brak również modyfikatora statycznego w definicji klasy MyHibernateBundle. Dopóki to działa, nawet lepiej niż inne odpowiedzi. – AndacAydin

+0

Niektóre bardziej kompletne informacje byłyby miłe. Relacja między modułem Guice a pakietem HibernateBundle nie jest jasna. – roded

0

Oto sposób mogę rozwiązać go:
Umieścić wiązkę hibernacji w module Guice i przekazać obiekt bootstap jako argument konstruktora modułu Guice więc wiązka hibernacji można dodawać do niego.
Konfiguracja może pozostać taka, jak przy użyciu pakietu hibernacji bez użycia funkcji.
mam to praca z dropwizard-hibernacji v0.7.1 i dropwizard-Guice v0.7.0.3

MyAppModule.java:

public class MyAppModule extends AbstractModule { 
    private final HibernateBundle<MyAppConfiguration> hibernateBundle = new HibernateBundle<MyAppConfiguration>(MyModel.class) { 
    @Override 
    public DataSourceFactory getDataSourceFactory(MyAppConfiguration configuration) { 
     return configuration.getDataSourceFactory(); 
    } 
    }; 

    public MyAppModule(Bootstrap<MyAppConfiguration> bootstrap) { 
    bootstrap.addBundle(hibernateBundle); 
    } 

    @Override 
    protected void configure() { 
    } 

    @Provides 
    public SessionFactory provideSessionFactory() { 
    return hibernateBundle.getSessionFactory(); 
    } 
} 

MyApplication.Java:

public class MyApplication extends Application<MyAppConfiguration> { 

    @Override 
    public void initialize(Bootstrap<MyAppConfiguration> bootstrap) { 
    bootstrap.addBundle(
      GuiceBundle.<MyAppConfiguration>newBuilder() 
        .addModule(new MyAppModule(bootstrap)) 
        .enableAutoConfig(getClass().getPackage().getName()) 
        .setConfigClass(MyAppConfiguration.class) 
        .build() 
    ); 
    } 

    @Override 
    public void run(final MyAppConfiguration configuration, final Environment environment) throws Exception { 
    } 

} 

MyAppConfiguration.java:

public class MyAppConfiguration extends Configuration { 
    @Valid 
    @NotNull 
    @JsonProperty("database") 
    private DataSourceFactory database = new DataSourceFactory(); 

    public DataSourceFactory getDataSourceFactory() { 
    return database; 
    } 
} 
+0

To nie działa dla mnie z dropwizard-guice 0.7.2 i dropwizard-hibernate 0.7.1. SessionFactory zwraca wartość null – Sathish

+0

Dziwne, mam przykład pracy z tymi wersjami. Zobacz [link] (https://github.com/blievens/dropwizard-guice-hibernate-example) dla przykładu. Prawdopodobnie wartość pusta jest związana z miejscem, w którym próbujesz wykonać @Inject. Moduł dropwizard-guice nie wstrzykuje we wszystkich klasach. – Blievens