Configuration Spring.net et NHibernate

Configuration Spring.net et NHibernate - C#/.NET managed - Programmation

Marsh Posté le 28-04-2008 à 12:12:08    

Bonjour, je n'arrive pas a faire fonctionner les frameworks Spring.net et NHibernate sous Visual Studio 2008.
J'aimerai en plus utiliser les transactions via Spring
 
Voici mon fichier AppConfig :  
 


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
    </sectionGroup>
    <section name="databaseSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
 
  <spring>
    <parsers>
      <parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
    </parsers>
 
    <context>
      <resource uri="Dao.xml" />
    </context>
  </spring>
 
  <!-- These properties are referenced in Dao.xml -->
  <databaseSettings>
    <add key="db.datasource" value="(local);Integrated Security=true" />
    <add key="db.user" value="root" />
    <add key="db.password" value="root" />
    <add key="db.database" value="adecco" />
  </databaseSettings>
 
</configuration>
 


 
Voici le fichier DAO.xml :  
 


<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
         xmlns:db="http://www.springframework.net/database">
 
  <!-- Property placeholder configurer for database settings -->
  <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
    <property name="ConfigSections" value="databaseSettings"/>
  </object>
 
  <!-- Database and NHibernate Configuration -->
  <!-- Attention la valeur du provider "MySql-5.0 doit etre trouve a cette URL http://www.springframework.net/doc-latest/reference/html/dbprovider.html#d0e10929" -->
  <db:provider id="DbProvider"
                   provider="MySql-5.0"                
                   connectionString="Server=localhost;Database=${db.database};User ID=${db.user};Password=${db.password}"/>
 
  <object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="MappingAssemblies">
      <list>
        <value>adecco</value>
      </list>
    </property>
    <property name="HibernateProperties">
      <dictionary>
 
        <entry key="hibernate.connection.provider"
               value="NHibernate.Connection.DriverConnectionProvider"/>
 
        <entry key="hibernate.dialect"
               value="NHibernate.Dialect.MySQL5Dialect"/>
 
        <entry key="hibernate.connection.driver_class"
               value="NHibernate.Driver.MySqlDataDriver"/>
         
        <!-- Mise en place du cache -->
        <entry key="hibernate.cache.provider_class"  
               value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache" />
        <entry key="relativeExpiration"  
               value="60" />
        <entry key="hibernate.cache.use_query_cache"  
               value="true" />
         
        <entry key="hibernate.current_session_context_class"
                     value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate12"/>        
      </dictionary>
    </property>
 
  </object>
 
  <!-- Pour la gestion des transaction avec NHibernate et Spring -->
  <object id="HibernateTransactionManager"
        type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="SessionFactory" ref="SessionFactory"/>
  </object>
 
  <!-- Mise en place d'un proxy pour les transactions  
  <object id="TxProxyConfigurationTemplate" abstract="true"
          type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data">
    <property name="PlatformTransactionManager" ref="HibernateTransactionManager"/>
    <property name="TransactionAttributes">
      <name-values>
         
        <add key="Process*" value="PROPAGATION_REQUIRED"/>
      </name-values>
    </property>
  </object> -->
 
 
  <object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
    <property name="SessionFactory" ref="SessionFactory" />
    <property name="TemplateFlushMode" value="Auto" />
    <property name="CacheQueries" value="true" />
  </object>
 
 
   
  <object id="QualificationDAO" type="adecco.DAO.QualificationDAO, adecco">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
   
  <!-- Data Access Objects  
  <object id="ClientDAO" type="adecco.DAO.ClientDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="ContratDAO" type="adecco.DAO.ContratDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="InterimaireDAO" type="adecco.DAO.InterimaireDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="QualificationDAO" type="adecco.DAO.Qualification, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="RaisonSocialDAO" type="adecco.DAO.RaisonSocialDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="RoutagePaieDAO" type="adecco.DAO.RoutagePaieDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="SecteurActiviteDAO" type="adecco.DAO.SecteurActiviteDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="StatutContratDAO" type="adecco.DAO.StatutContratDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object>
  <object id="TypeAvenantDAO" type="adecco.DAO.TypeAvenantDao, adecco.DAO">
    <property name="SessionFactory" ref="SessionFactory"/>
    <property name="TransactionManager" ref="HibernateTransactionManager"/>
  </object> -->
 
</objects>
 
 


 
Voici, le main :  
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using adecco.DAO;
  6. using adecco.Entities;
  7. using Spring.Context;
  8. using Spring.Context.Support;
  9. namespace adecco
  10. {
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             System.Console.Out.WriteLine("L'application démarre...\n" );
  16.             try
  17.             {
  18.                 IApplicationContext ctx = ContextRegistry.GetContext();
  19.                
  20.                 string valeur;
  21.                 Console.Clear();
  22.                 Console.Out.WriteLine("\nVeuillez entrer une qualification :\n" );
  23.                 valeur = Console.ReadLine();
  24.                 QualificationDAO q = (QualificationDAO)ctx.GetObject("MyQualificationDAO" );
  25.                 Qualification tmp = new Qualification(valeur);
  26.                 q.createQualification(tmp);
  27.             }
  28.             catch (System.Exception ex)
  29.             {
  30.                 System.Console.Error.WriteLine("\n\n" + ex.ToString() + "\n\n" );
  31.             }
  32.             finally
  33.             {
  34.                 //System.Console.Clear();
  35.                 //System.Console.Out.WriteLine("\nL'application est fermée! Appuyer sur une touche\n" );
  36.                 System.Console.ReadLine();
  37.             }
  38.         }
  39.     }
  40. }


 
Sachant que ma classe QualificationDAO ne fait rien pour l'instant donc je ne l'a publie pas.
 
Voici le message d'erreur :  
 


System.Configuration.ConfigurationErrorsException: Error creating context 'sprin
g.root': 'TransactionManager' node cannot be resolved for the specified context
[adecco.DAO.QualificationDAO]. ---> Spring.Util.FatalReflectionException: Cannot
 instantiate Type [Spring.Context.Support.XmlApplicationContext] using ctor [Voi
d .ctor(System.String, Boolean, System.String[])] : 'Une exception a été levée p
ar la cible d'un appel.' ---> System.Reflection.TargetInvocationException: Une e
xception a été levée par la cible d'un appel. ---> Spring.Objects.Factory.Object
CreationException: Error creating object with name 'QualificationDAO' defined in
 'file [D:\Mes Documents\Visual Studio 2008\Projects\adecco\adecco\bin\Debug\Dao
.xml]' : Initialization of object failed : 'TransactionManager' node cannot be r
esolved for the specified context [adecco.DAO.QualificationDAO]. ---> Spring.Cor
e.InvalidPropertyException: 'TransactionManager' node cannot be resolved for the
 specified context [adecco.DAO.QualificationDAO].
   à Spring.Expressions.PropertyOrFieldNode.InitializeNode(Object context)
   à Spring.Expressions.PropertyOrFieldNode.Set(Object context, EvaluationContex
t evalContext, Object newValue)
   à Spring.Expressions.BaseNode.SetValue(Object context, IDictionary variables,
 Object newValue)
   à Spring.Expressions.BaseNode.Spring.Expressions.IExpression.SetValue(Object
context, Object newValue)
   à Spring.Objects.ObjectWrapper.SetPropertyValue(IExpression propertyExpressio
n, Object val)
   à Spring.Objects.ObjectWrapper.SetPropertyValue(PropertyValue pv)
   à Spring.Objects.ObjectWrapper.SetPropertyValues(IPropertyValues propertyValu
es, Boolean ignoreUnknown)
   à Spring.Objects.ObjectWrapper.SetPropertyValues(IPropertyValues pvs)
   à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.ApplyPr
opertyValues(String name, RootObjectDefinition definition, IObjectWrapper wrappe
r, IPropertyValues properties)
   à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.Populat
eObject(String name, RootObjectDefinition definition, IObjectWrapper wrapper)
   à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.Configu
reObject(String name, RootObjectDefinition definition, IObjectWrapper wrapper)
   à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateO
bject(String name, RootObjectDefinition definition, Object[] arguments, Boolean
allowEagerCaching)
   --- Fin de la trace de la pile d'exception interne ---
   à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateO
bject(String name, RootObjectDefinition definition, Object[] arguments, Boolean
allowEagerCaching)
   à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateO
bject(String name, RootObjectDefinition definition, Object[] arguments)
   à Spring.Objects.Factory.Support.AbstractObjectFactory.CreateAndCacheSingleto
nInstance(String objectName, RootObjectDefinition objectDefinition, Object[] arg
uments)
   à Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name,
 Type requiredType, Object[] arguments)
   à Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name)
 
   à Spring.Objects.Factory.Support.DefaultListableObjectFactory.PreInstantiateS
ingletons()
   à Spring.Context.Support.AbstractApplicationContext.Refresh()
   à Spring.Context.Support.XmlApplicationContext..ctor(Boolean refresh, String
name, Boolean caseSensitive, IApplicationContext parentContext, String[] configu
rationLocations)
   à Spring.Context.Support.XmlApplicationContext..ctor(String name, Boolean cas
eSensitive, String[] configurationLocations)
   --- Fin de la trace de la pile d'exception interne ---
   à System.RuntimeMethodHandle._InvokeConstructor(Object[] args, SignatureStruc
t& signature, IntPtr declaringType)
   à System.RuntimeMethodHandle.InvokeConstructor(Object[] args, SignatureStruct
 signature, RuntimeTypeHandle declaringType)
   à System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Bi
nder binder, Object[] parameters, CultureInfo culture)
   à System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
   à Spring.Util.ObjectUtils.InstantiateType(ConstructorInfo constructor, Object
[] arguments)
   --- Fin de la trace de la pile d'exception interne ---
   à Spring.Util.ObjectUtils.InstantiateType(ConstructorInfo constructor, Object
[] arguments)
   à Spring.Context.Support.ContextHandler.RootContextInstantiator.InvokeContext
Constructor(ConstructorInfo ctor)
   à Spring.Context.Support.ContextHandler.ContextInstantiator.InstantiateContex
t()
   à Spring.Context.Support.ContextHandler.InstantiateContext(IApplicationContex
t parentContext, Object configContext, String contextName, Type contextType, Boo
lean caseSensitive, String[] resources)
   à Spring.Context.Support.ContextHandler.Create(Object parent, Object configCo
ntext, XmlNode section)
   --- Fin de la trace de la pile d'exception interne ---
   à System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, Sec
tionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord s
ectionRecord, Object parentResult)
   à System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factory
Record, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolea
n getRuntimeObject, Object& result, Object& resultRuntimeObject)
   à System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String con
figKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boole
an requestIsHere, Object& result, Object& resultRuntimeObject)
   à System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String con
figKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boole
an requestIsHere, Object& result, Object& resultRuntimeObject)
   à System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String con
figKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boole
an requestIsHere, Object& result, Object& resultRuntimeObject)
   à System.Configuration.BaseConfigurationRecord.GetSection(String configKey, B
oolean getLkg, Boolean checkPermission)
   à System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
   à System.Configuration.ClientConfigurationSystem.System.Configuration.Interna
l.IInternalConfigSystem.GetSection(String sectionName)
   à System.Configuration.ConfigurationManager.GetSection(String sectionName)
   à Spring.Util.ConfigurationUtils.GetSection(String sectionName)
   à Spring.Context.Support.ContextRegistry.InitializeContextIfNeeded()
   à Spring.Context.Support.ContextRegistry.GetContext()
   à adecco.Program.Main(String[] args) dans D:\Mes Documents\Visual Studio 2008
\Projects\adecco\adecco\Program.cs:ligne 22


 
Je ne comprend vraiment pas ce qui bug. Apparemment, il n'aime pas l'objet 'TransactionManager'.
Si quelqu'un peut m'aider, ce serai sympa.
Mais c vrai que j'en suis à mon 6ème msg sur plusieurs sujet différent sans aucune réponse. A croire que personne ne configure de framework en France.
 
Cordialement...

Reply

Marsh Posté le 28-04-2008 à 12:12:08   

Reply

Marsh Posté le 30-04-2008 à 14:50:36    

Salut,
 
si j'ai bien compris l'erreur, il n'existe pas de propriété TransactionManager dans ton Dao.
 
Si tes DAO implementent bien HibernateDaoSupport, tu devrais plutot setter la propriété HibernateTemplate :

Code :
  1. <object id="QualificationDAO" type="adecco.DAO.QualificationDAO, adecco">
  2.    <property name="HibernateTemplate" ref="HibernateTemplate"/>
  3. </object>


 
De plus, tu devrais plutot travailler avec des interfaces pour tes DAO au lieu de manipuler directement l'implémtation.
 
Il y a des exemples fournit avec NHibernate dans Spring.NET, jettes y un oeil.
 
N'hésites pas à poser des questions sur leur forums:
http://forum.springframework.net


Message édité par mrxl le 30-04-2008 à 14:52:50
Reply

Marsh Posté le 01-05-2008 à 14:05:53    

tu sais, tant qu' afaire, utiliser LINQ for SQL plutot qu' NHIBERNATE. Car NHIBERNATE, niveau performance, c'est l'ultra catastrophe.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed