org.springframework.beans.NotWritablePropertyException: недопустимое свойство ‘interceptorNames’ класса bean

#spring #hibernate

#spring #спящий режим

Вопрос:

У меня эта ошибка. Я хочу создать транзакцию в режиме гибернации с использованием Spring. Но у меня всегда такая ошибка. Он не может создать службу bean person, которая расширяет bean «Прокси». «Прокси» создает транзакции, вызывающие диспетчер транзакций и перехватчики.


 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Proxy' defined in class path resource [com/borzacchiello/user/springldap/springldapVersioneSeconda.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'interceptorNames' of bean class [org.springframework.transaction.interceptor.TransactionProxyFactoryBean]: Bean property 'interceptorNames' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1279)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
        ... 21 more
    Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'interceptorNames' of bean class [org.springframework.transaction.interceptor.TransactionProxyFactoryBean]: Bean property 'interceptorNames' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:801)
        at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:651)
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1276)
  

Мои XML-файлы следующие:

1)

 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">



<bean id="transactionManager" 
class="org.springframework.orm.hibernate3.HibernateTransactionManager">                                                                                         
     <property name="dataSource" ref="dataSource" />        
     <property name="sessionFactory" ref="sessionFactory" />
 </bean> 

 <bean id="Proxy"
 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">            
      <property name="interceptorNames">
          <list>
              <value>transactionInterceptor</value>
          </list>
       </property>      
 </bean> 

<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="transactionAttributes">
        <props>
            <prop key="save">PROPAGATION_REQUIRES_NEW</prop>
        <prop key="getValorePerCodice">PROPAGATION_REQUIRES_NEW,readOnly</prop>
        </props>
     </property>    
 </bean>

 <bean id="ldapService" parent="Proxy"
 class="com.borzacchiello.login.ldap.service.LdapService">
     <property name="contactDAO">
         <ref bean="contactDAO"/>
     </property>
 </bean>

 <bean id="contactDAO" class="com.borzacchiello.login.ldap.DAO.LDAPContactDAO" >
     <property name="sessionFactory" ref="sessionFactory" />        
 </bean>

 <bean id="personService" parent="Proxy"
 class="com.borzacchiello.service.impl.PersonServiceImpl" >          
     <property name="personDao" ref="personDao" />
     <property name="stockService" ref="stockService" />
 </bean>

 <bean id="personDao" class="com.borzacchiello.dao.impl.PersonDaoImpl" >
     <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

 <bean id="stockService" class="com.borzacchiello.service.impl.StockServiceImpl" >
     <property name="stockDao" ref="stockDao" />
 </bean>         

 <bean id="stockDao" class="com.borzacchiello.dao.impl.StockDaoImpl" >
     <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>        

 </beans>
  

     2)
  

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- Hibernate session factory -->
<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>

    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="hibernate.current_session_context_class">thread</prop> 
       </props>
    </property>

    <property name="mappingResources">
    <list>
          <value>com/borzacchiello/hibernate/hbm/Customer.hbm.xml</value>
          <value>com/borzacchiello/hibernate/hbm/Configurazione.hbm.xml</value>
          <value>com/borzacchiello/hibernate/hbm/Person.hbm.xml</value>
          <value>com/borzacchiello/hibernate/hbm/Stock.hbm.xml</value>
    </list>
    </property> 

</bean>

</beans>
  

3)

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>classpath:/config/database/properties/database.properties</value>
    </property>
</bean>

<bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
 </bean>

</beans>
  

     This is my main :
  

 public static void main(String[] args) {

    Person person = new Person();
person.setId(5);
person.setName("name1");
person.setSurname("name2");
person.setAddress("address");               
PersonService personService =(PersonService)LocalContext.getBean("personService");
personService.save(person, "LVerde");

}
  

     These are my java classes:
  

     1)
  

 import org.hibernate.exception.ConstraintViolationException;    
import com.borzacchiello.service.PersonService;
import com.borzacchiello.service.StockService;
import com.borzacchiello.dao.PersonDao;
import com.borzacchiello.model.Person;
import com.borzacchiello.model.Stock;

public class PersonServiceImpl implements PersonService{

    PersonDao personDao;
    StockService stockService;


    public PersonDao getPersonDao() {
        return personDao;
    }

    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }



    public StockService getStockService() {
        return stockService;
    }

    public void setStockService(StockService stockService) {
        this.stockService = stockService;
    }

    public void save(Person person, String stock_code){

        try {
            personDao.save(person);
        System.out.println("Person Inserted");
        Stock stock = new Stock();
        stock.setStock_id(person.getId());
        stock.setStock_code(stock_code);
        stock.setStock_name("Legno Verde");
        boolean bool = stockService.getByName(stock.getStock_name());
        if(!bool)
        {
            stockService.save(stock);
            System.out.println("stock Inserted");
        }
        else
        {

        }
        } catch (ConstraintViolationException e) {

        }

    }

}
  

2)

 public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao{

    public void save(Person person){

        getHibernateTemplate().save(person);
    }

}
  

3)

 public class StockServiceImpl implements StockService{

    StockDao stockDao;

    public void setStockDao(StockDao stockDao) {
        this.stockDao = stockDao;
    }

    public void save(Stock stock){
        stockDao.save(stock);
    }

    @Override
    public boolean getByName(String string) {
        return stockDao.getByName(string);      
    }

}
  

     4)
  

 public class StockDaoImpl extends HibernateDaoSupport implements StockDao{

    public void save(Stock stock){
        getHibernateTemplate().save(stock);
    }

    //colonne e tabelle devo avere lo stesso nome della classe e dei campi
    @Override
    public boolean getByName(String nome) {
        List<Object> lista=getHibernateTemplate().find("select stock_name from Stock");
        boolean bool= (lista.size()>0)?true : false;
        return bool;
    }

}
  

Может кто-нибудь сказать мне, где я допускаю ошибки? Надеюсь, все понятно.

Комментарии:

1. Я настоятельно рекомендую НЕ использовать TransactionalProxyFactoryBean . Использовать либо @Transactional в сочетании с <tx:annotation-driven >, либо использовать <tx:advice /> с <aop:config >. Используемый вами класс является наследием от Spring 1 и все еще существует для обратной совместимости, но при создании новых приложений (или обновлении), пожалуйста, не используйте его больше.

Ответ №1:

У класса org.springframework.transaction.interceptor.TransactionProxyFactoryBean нет свойства interceptorNames