2012-04-10 9 views
0

Meine Anwendung verwendet Spring 3 + MyBatis 3. Ich versuche, mehrere Datenbankverbindungen (MySQL und Oracle) einzurichten, und ich habe diese Nachricht erhalten.Fehler beim Festlegen der Eigenschaftswerte (Spring 3 + mybatis 3)

Error creating bean with name 'MySQLService' defined in ServletContext resource [/WEB-INF/appContext-database.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'MySQLDao' of bean class [com.ekalife.MyGadget.service.MainService]: Bean property 'MySQLDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 

Mein Setup appContext-database.xml

<!-- ========== Setting Database and Connection Pooling ========== --> 

<bean id="dataSourceMySQL" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" 
    p:driverClass="${jdbc.driver}" 
    p:jdbcUrl="${jdbc.url}" 
    p:user="${jdbc.user}" 
    p:password="${jdbc.password}" 
    p:idleConnectionTestPeriod="3600" 
    p:preferredTestQuery="SELECT * FROM HD_USERS" 
    p:acquireRetryAttempts="50" 
    p:autoCommitOnClose="false" /> 

<bean id="dataSourceORA" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" 
    p:driverClass="${jdbc.driverORA}" 
    p:jdbcUrl="${jdbc.urlORA}" 
    p:user="${jdbc.userORA}" 
    p:password="${jdbc.passwordORA}" 
    p:idleConnectionTestPeriod="3600" 
    p:preferredTestQuery="SELECT SYSDATE FROM DUAL" 
    p:acquireRetryAttempts="50" 
    p:autoCommitOnClose="false"/> 

<!-- transaction manager --> 
<bean id="MySQLService" class=" com.ekalife.MyGadget.service.MainService"> 
    <property name="MySQLDao" ref="MySQLDao"/> 
</bean> 

<bean id="ORAService" class=" com.ekalife.MyGadget.service.OraService"> 
    <property name="ORADao" ref="ORADao"/> 
</bean> 

<!-- MySQL transactional advice --> 
<tx:advice id="mySqlTxAdvice" transaction-manager="transactionManagerMySQL"> 
    <tx:attributes> 
     <tx:method name="select" read-only="true" /> 
     <tx:method name="view" read-only="true" /> 
     <tx:method name="*" /> 
    </tx:attributes> 
</tx:advice> 
<aop:config> 
    <aop:pointcut id="mySQLManagerMethods" expression="execution(* com.ekalife.MyGadget.service.MainService.*(..))"/> 
    <aop:advisor advice-ref="mySqlTxAdvice" pointcut-ref="mySQLManagerMethods" /> 
</aop:config> 
<bean id="transactionManagerMySQL" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSourceMySQL" /> 
</bean> 

<!-- Oracle transactional advice --> 
<tx:advice id="oraTxAdvice" transaction-manager="transactionManagerORA"> 
    <tx:attributes> 
     <tx:method name="select" read-only="true" /> 
     <tx:method name="view" read-only="true" /> 
     <tx:method name="*" /> 
    </tx:attributes> 
</tx:advice> 
<aop:config> 
    <aop:pointcut id="oraManagerMethods" expression="execution(* com.ekalife.MyGadget.service.OraService.*(..))" /> 
    <aop:advisor advice-ref="oraTxAdvice" pointcut-ref="oraManagerMethods" /> 
</aop:config> 
<bean id="transactionManagerORA" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSourceORA"/> 
</bean> 

<bean id="MySQLDao" class="org.mybatis.spring.SqlSessionFactoryBean" 
    p:dataSource-ref="dataSourceMySQL" 
    p:mapperLocations="classpath*:com/ekalife/MyGadget/dao/MySQL/**/*.xml" 
    p:typeAliasesPackage="com.ekalife.MyGadget.model" /> 
<bean id="MySQLDaoSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg ref="MySQLDao"/> 
</bean> 

<bean id="ORADao" class="org.mybatis.spring.SqlSessionFactoryBean" 
    p:dataSource-ref="dataSourceORA" 
    p:mapperLocations="classpath*:com/ekalife/MyGadget/dao/Ora/**/*.xml" 
    p:typeAliasesPackage="com.ekalife.MyGadget.model" /> 
<bean id="ORADaoSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg ref="ORADao"/> 
</bean> 

<bean id="MySQLMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" 
    p:sqlSessionTemplate-ref="MySQLDaoSessionTemplate" 
    p:mapperInterface="com.ekalife.MyGadget.dao.MainMapper" 
    p:sqlSessionFactory-ref="MySQLDao"/> 
<bean id="ORAMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" 
    p:sqlSessionTemplate-ref="ORADaoSessionTemplate" 
    p:mapperInterface="com.ekalife.MyGadget.dao.OraMapper" 
    p:sqlSessionFactory-ref="ORADao"/> 

MySQL-Service

package com.ekalife.MyGadget.service; 

@Transactional 
public class MainService { 

    private static Logger logger = Logger.getLogger(MainService.class); 

    @Autowired 
    private MainMapper mainMapper; 

Oracle Service

@Transactional 
public class OraService { 

    private static Logger logger = Logger.getLogger(MainService.class); 

    @Autowired 
    private OraMapper oraMapper; 

Vielen Dank im Voraus :)

+1

aber ich konnte nicht eine Eigenschaft mit mysqldao in Serviceklasse und seine Setter-Methode auch :(, ist es etwas @transaction zu tun? Oder sollte es sein –

+0

ist es @Transactional („MySQLDao“) öffentlich sein müssen Klasse MainService? –

Antwort

0

Sie sollten MySQLDao in Ihrem MainService und seinem Setzer und Getter erklären, weil Frühling danach sucht.

Ein weiterer Fehler ist, dass Variablennamen mit lowcase beginnen sollte:

<bean id="MySQLService" class=" com.ekalife.MyGadget.service.MainService"> 
    <property name="mySQLDao" ref="MySQLDao"/> 
</bean> 

Auch ich einige Inkohärenz zu sehen. Ihre MainService hat eine Eigenschaft, dass es mainMapper autowired, sondern auch in dem Anwendungskontext xml mögen Sie mySQLDao

inyect Es ist besser, die gleiche Strategie für alle inyection zu wählen. Zum Beispiel schlage ich Sie alle in der XML-Konfiguration inyect:

<bean id="MySQLService" class=" com.ekalife.MyGadget.service.MainService"> 
    <property name="mySQLDao" ref="MySQLDao"/> 
    <property name="mainMapper" ref="MySQLMapper"/> 
</bean> 

UPTATED: Wir beantworten Ihre Frage

package com.ekalife.MyGadget.service; 

// imports... 

@Transactional 
public class MainService { 

    private static Logger logger = Logger.getLogger(MainService.class); 

    private MainMapper mainMapper; 

    private SqlSessionFactoryBean mySQLDao; 

    // your methods 

    // setter and getter methods for mySQLDao and mainMapper 

} 
+0

Wie deklariere ich MySQLDao in MainService? Gibt es eine einfache Möglichkeit, mehrere Verbindungen (mysql und oracle) im Frühjahr zu erstellen? –

+0

Siehe meine aktualisiert, um zu sehen, wie MySQLDao deklarieren.Es gibt keine einfache Möglichkeit, zwei Datenquellen zu deklarieren zumindest im Frühling, wie Sie es erwarten – jddsantaella

+0

Ich habe eine andere Nachricht erhalten "Fehler beim Erstellen von Bean mit dem Namen 'MySQLService' in der ServletContext-Ressource [/WEB-INF/appContext-database.xml] definiert: Initialisierung von Bean fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.ConversionNotSupporte dException: Fehler beim Konvertieren des Eigenschaftswerts vom Typ 'org.apache.ibatis.session.defaults.DefaultSqlSessionFactory' in den erforderlichen Typ 'org.mybatis.spring.SqlSessionFactoryBean' für die Eigenschaft 'mySQLDao': Keine übereinstimmenden Editoren oder Konvertierungsstrategien gefunden " –

0

Der Hauptgrund, Sie werden immer die Fehlermeldung "wie MySQLDao in MainService zu erklären" ist, weil Sie nicht getter und Setter für Sie Mainservice und OraService Klasse haben. Der Spring Error sagt Ihnen sogar, dass "nicht schreibbar ist oder eine ungültige Setter-Methode hat".