问题描述
我从4.1.6升级到最新的Spring版本。发布到4.2.4.Release,突然之前所有的功能都顺利运行,现在抛出以下异常。
javax.persistence.TransactionRequiredException:没有实际事务可用于当前线程的EntityManager - 无法可靠地处理'persist'调用
在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
公共类MessageInterceptor实现EndpointInterceptor {
@Resource
private SaveMessageDO saveMessageDO;
$ b $ @Override
public boolean handleRequest(MessageContext messageContext,Object endpoint){
saveMessageDO.addMessage(messageContext.getRequest()));
返回true;
$ b @Override
public boolean handleResponse(MessageContext messageContext,Object endpoint){
return false;
}
@Override
public boolean handleFault(MessageContext messageContext,Object endpoint){
return false;
$ b @Override
public void afterCompletion(MessageContext messageContext,Object endpoint,Exception ex){
SaveMessageDO.class
/ **
*实体经理。
* /
@PersistenceContext(unitName =xxxHibernatePersistenceUnit)
private EntityManager entityManager;
/ **
*添加消息。
*
* @param消息消息
* /
@Transactional(value =xyzTxManager,propagation = Propagation.REQUIRED)
public void addMessage(final Message消息){
entityManager.persist(message);
}
SharedEntityManagerCreator.java中发生异常
else if(transactionRequiringMethods.contains(method.getName())){
//根据JPA规范,我们现在需要一个事务性目标。
//否则,该操作会被接受但仍然不会被刷新......
if(target == null ||!TransactionSynchronizationManager.isActualTransactionActive()){
throw new TransactionRequiredException(No EntityManager当前线程的实际事务可用+
- 不能可靠地处理'+ method.getName()+'call);
该方法用@Transaction注解标记,当我调用切换回老的春天版本其工作正常,没有任何问题。
位代码背景,从Spring Webservices拦截器调用以将SOAP消息存储在数据库中。
解决方案尝试将您的版本升级到此处公布的4.2.4版本:的JPA行为不一致以及此错误报告
无论如何,如果不是新版本,仍然可以解决您的问题,因为很多问题和回归都已修复。
可能归因于框架的问题,检查任何修补程序版本并检查其错误管理系统总是一个好主意,例如
I have upgraded to latest Spring version from 4.1.6.Release to 4.2.4.Release and suddenly all what has functioned smoothly before, now throws the following exception.
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);
}
Exception occurs in 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");
}
}
The method are marked with @Transaction Annotation, when i call switch back to older spring version its works fine without any issues.
Bit Background about the code, calling from Spring Webservices Interceptors to store SOAP Message in database.
解决方案 Try upgrading your version to 4.2.4 announced here: https://spring.io/blog/2015/12/17/spring-framework-4-2-4-4-1-9-released
I think the problem your experiencing is possibly related to this question: Inconsistent JPA behavior using no transaction, propagation SUPPORTS and OpenEntityManager pattern and this bug report https://jira.spring.io/browse/SPR-13243
And in anyway, if it isn't the new version may still resolve your problem as many issues and regressions were fixed.
When getting unexpected issues that could be attributed to a framework it's always a good idea to check for any fix releases and to check their bug management system as well e.g. https://jira.spring.io/browse/SPR-13243?jql=project%20%3D%20SPR%20AND%20text%20~%20transactionrequiredexception
这篇关于从Spring 4.1.6升级到4.2.4并突然收到TransactionRequiredException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!