#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