2014-04-27 12 views
7

Sto cercando di configurare hibernatebundle con guice/dropwizard e ho bisogno di aiuto. Sto usando hubspot/dropwizard-guice/0.7.0 Libreria di terze parti oltre alla lib di dropwizard.come collegare automaticamente HibernateBundle a guice su dropwizard?

Il codice seguente ovviamente non funzionerà e avrà bisogno di aiuto per capirlo. Come faccio a riscriverlo in modo tale che hibernatebundle e, in definitiva, session factory, sia autoiniettato a qualunque bean ne abbia bisogno.

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

Hai risolto questo? Sto avendo lo stesso problema. – user1226868

risposta

5

Ecco come finisco. Non ho mai avuto una risposta da qui o da una mailing list, quindi considererei questo hackish e probabilmente non il modo corretto per farlo, ma funziona per me.

Nel mio modulo (che estende 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(); 
} 

revised:

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

come si chiama a livello di programmazione 'hibernateBundle.run (configuration, environment); dato che non si ha l'istanza' environment' disponibile nel modulo (che estende abstractmodule)? –

-1

Non ho usato hibernate nel dropwizard, ma ho usato Guice e davvero solo bisogno di preoccuparsi di MyAppModule. Ecco dove la magia accadrà:

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(); 
    } 
} 

(vedi here per più classi)

MyAppConfiguration.java e MyApplication.java non dovrebbero avere nessuno dei riferimenti hibernate fascio in Si dovrebbe quindi essere in grado di @. Iniettare una SessionFactory dove mai ne hai bisogno.

3

ho pensato che il periodo esplicito (configurazione, ambiente) chiamata (nella risposta fornita da @StephenNYC) era un po 'strano, quindi ho scavato un po' più a fondo. Ho scoperto che AutoConfig in dropwizard-guice non stava configurando correttamente ConfiguredBundle (HibernateBundle è un tipo simile).

partire https://github.com/HubSpot/dropwizard-guice/pull/35 il codice può ora guardare come questo, invece:

@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()); 
} 

La magia di questo è che MyHibernateBundle implementa ConfiguredBundle che dropwizard-Guice ora raccoglie automaticamente e crea un'istanza.

+0

uhm, ottengo "Nessuna implementazione per org.hibernate.SessionFactory associata." – AndacAydin

+0

informazioni mancanti: questo codice deve essere inserito nella classe del modulo. Manca anche un modificatore statico nella definizione della classe MyHibernateBundle. Dopo che funziona, anche meglio delle altre risposte. – AndacAydin

+0

Alcune informazioni più complete sarebbero belle. La relazione tra il modulo Guice e HibernateBundle non è chiara. – roded

0

Qui è il modo ho risolto:
Porre il fascio sospensione nel modulo Guice e passare l'oggetto bootstap come argomento del costruttore modulo Guice così il fascio di sospensione può essere aggiunto ad esso.
La configurazione può rimanere esattamente come si usa un bundle di ibernazione senza guizzi.
ho ottenuto questo lavoro con dropwizard-hibernate v0.7.1 e 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

Questo non funziona per me con dropwizard-guice 0.7.2 e dropwizard-hibernate 0.7.1. SessionFactory viene restituito come null – Sathish

+0

Strano, ho un esempio di lavoro con queste versioni. Vedi [collegamento] (https://github.com/blievens/dropwizard-guice-hibernate-example) per l'esempio. Forse il null è legato al punto in cui provi a fare @Inject. Il modulo dropwizard-guice non viene iniettato in tutte le classi. – Blievens