Итак, похоже, что один из возможных вариантов - разделить мою реализацию на два класса.Один, который будет содержать всю бизнес-логику, которая вызывает уровень персистентности базы данных, и другой, который предоставляет веб-сервис и вызывает бизнес-логику.Класс, содержащий бизнес-логику, может быть обернут в среду Spring * ProxyFactoryBean
для использования HibernateInterceptor
.
Java:
public class BusinessLogicClass implements MyInterface {
public void doBusinessLogic() {
//Perform Hibernate stuff here
}
}
@WebService
public class WebServiceClass {
BusinessLogicClass blc;
public setBlc(BusinessLogicClass blc) {
this.blc = blc;
}
@WebMethod
public void doLogic() {
blc.doBusinessLogic()
}
}
Spring XML Configuration:
<bean id="transactionalService" class="BusinessLogicClass">
</bean>
<bean id="transactionalServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="transactionalMessageQueueService"/>
</property>
<property name="proxyInterfaces">
<value>MyInterface</value>
</property>
<property name="interceptorNames">
<value>hibernateInterceptor</value>
</property>
</bean>
<bean id="webService" class="WebServiceClass">
<property name="blc">
<ref bean="transactionalServiceProxy"/>
</property>
</bean>
Это решает мою проблему.Хотя для моего приложения немного раздражает наличие двух классов с практически одинаковыми методами, просто продолжайте работать ...
- Обновление -
В качестве альтернативы (возможно, лучшей альтернативы) использованию конфигурации прокси-сервера в Spring XML можно использовать управление переводами на основе аннотаций файлов, а затем каждый метод в BusinessLogicClass
, который должен был находиться внутри транзакции, можно пометить * 1020.*.Именно такой подход я и использовал в конечном итоге.