【发布时间】:2015-12-28 13:49:33
【问题描述】:
我已经从 4.1.6.Release 升级到最新的 Spring 版本到 4.2.4.Release 并且突然所有之前运行顺利的东西,现在抛出以下异常。
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]
Interceptor.class
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);
}
SharedEntityManagerCreator.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 Annotation,当我调用 switch 回到旧的 spring 版本时,它可以正常工作,没有任何问题。
关于代码的一些背景知识,从 Spring Webservices Interceptors 调用以将 SOAP 消息存储在数据库中。
【问题讨论】:
-
我认为我们需要更多背景知识。 :)
-
@Basco,我们希望在将消息发布到队列之前将消息保存在数据库中,并在我们编写的拦截器中拦截消息并存储在数据库中。添加了更多代码以供理解
-
您需要在
applicationContext.xml中包含您的交易配置以及您使用的服务器(即 JBoss(又名 WildFly))
标签: spring hibernate spring-ws spring-transactions