从Spring 4.1.6升级到4.2.4,突然获得TransactionRequiredException
我已经升级到了最新的Spring版本,从4.1.6.Release升级到4.2.4.Release,突然之间,所有以前运行顺利的功能都出现了以下异常从Spring 4.1.6升级到4.2.4,突然获得TransactionRequiredException,spring,hibernate,spring-ws,spring-transactions,Spring,Hibernate,Spring Ws,Spring Transactions,我已经升级到了最新的Spring版本,从4.1.6.Release升级到4.2.4.Release,突然之间,所有以前运行顺利的功能都出现了以下异常 javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springfr
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:277) ~[na:4.2.4.RELEASE]
at com.sun.proxy.$Proxy51.persist(Unknown Source) ~[na:na]
拦截器类
public class MessageInterceptor implements EndpointInterceptor {
@Resource
private SaveMessageDO saveMessageDO;
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) {
saveMessageDO.addMessage(messageContext.getRequest()));
return true;
}
@Override
public boolean handleResponse(MessageContext messageContext, Object endpoint) {
return false;
}
@Override
public boolean handleFault(MessageContext messageContext, Object endpoint) {
return false;
}
@Override
public void afterCompletion(MessageContext messageContext, Object endpoint, Exception ex) {
}
}
SaveMessageDO.class
/**
* The entity manager.
*/
@PersistenceContext(unitName = "xxxHibernatePersistenceUnit")
private EntityManager entityManager;
/**
* Adds the message.
*
* @param message the message
*/
@Transactional(value = "xyzTxManager", propagation = Propagation.REQUIRED)
public void addMessage(final Message message) {
entityManager.persist(message);
}
SharedIdentityManagerCreator.java中发生异常
else if (transactionRequiringMethods.contains(method.getName())) {
// We need a transactional target now, according to the JPA spec.
// Otherwise, the operation would get accepted but remain unflushed...
if (target == null || !TransactionSynchronizationManager.isActualTransactionActive()) {
throw new TransactionRequiredException("No EntityManager with actual transaction available " +
"for current thread - cannot reliably process '" + method.getName() + "' call");
}
}
该方法用@Transaction注释标记,当我调用switch返回到较旧的spring版本时,它可以正常工作,没有任何问题
位代码背景,从Spring Webservices拦截器调用以在数据库中存储SOAP消息。尝试将您的版本升级到4.2.4,如下所示: 4.2.4解决了4.2.x行中的一些回归,包括许多 修复和增强,没有立即遗留的问题。4.2.4是一个 建议所有4.x用户立即升级 我认为您遇到的问题可能与这个问题有关:以及这个bug报告 无论如何,如果不是新版本,它仍然可以解决您的问题,因为许多问题和回归都已修复
当遇到可能归因于框架的意外问题时,最好检查是否有任何修复版本,并检查其错误管理系统,例如。我认为我们需要更多的背景知识。:)@Basco,我们希望在发布队列之前将消息保存在数据库中,并保存在我们编写的截取器中,以截取消息并存储在数据库中。添加了更多代码以便于理解您需要在
applicationContext.xml
中包含事务的配置,以及您正在使用的服务器(即JBoss(又名WildFly)),谢谢您的回答。更新为最新的Spring版本4.2.4.0。这没用。我想已经有人发布了:。我想我的问题也与此有关。Spring承诺在4.2中修复此问题。5@SathishMurugesan很高兴听到正在进行。如果问题在4.2.5中得到解决,请让我们知道并自行回答?:)