Hibernate SOAP服务器实现中的事务管理
我有一个标准的jax-ws-webservice设置,它使用Spring进行DI,使用Hibernate进行持久化。现在,在春季,您通常会将请求包装在自定义筛选器中,并在Hibernate会话上执行Hibernate SOAP服务器实现中的事务管理,hibernate,spring,session,soap,Hibernate,Spring,Session,Soap,我有一个标准的jax-ws-webservice设置,它使用Spring进行DI,使用Hibernate进行持久化。现在,在春季,您通常会将请求包装在自定义筛选器中,并在Hibernate会话上执行beginTransaction()和commit()/rollback(),具体取决于执行是否顺利进行 然而,对于soapweb客户机,没有使用这个执行链,因此不能像这样轻松地设置事务管理。当然,我也希望避免将我的@WebMethod实现包装在 session.beginTransaction();
beginTransaction()
和commit()
/rollback()
,具体取决于执行是否顺利进行
然而,对于soapweb客户机,没有使用这个执行链,因此不能像这样轻松地设置事务管理。当然,我也希望避免将我的@WebMethod
实现包装在
session.beginTransaction();
try {
...
session.commit();
}
catch (RuntimeException e) {
session.rollback();
throw e;
}
所以我研究了其他的可能性。显然,JSR允许配置SOAPHandler
(通过@HandlerChain
)在传入和传出SOAP消息发送之前拦截SOAP流量,但我想知道我是否在正确的轨道上,还是做得不对
你们知道其他的选择吗
我选择了
SOAPHandler
路线,它似乎工作得很好:
public class SOAPServiceHandler implements SOAPHandler<SOAPMessageContext>
{
@Override
public void close(MessageContext mc)
{
}
@Override
public boolean handleFault(SOAPMessageContext smc)
{
MyHibernateUtil.rollbackTransaction();
return true;
}
@Override
public boolean handleMessage(SOAPMessageContext smc)
{
Session session = MyHibernateUtil.getCurrentSession();
Boolean outbound = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!outbound)
{
session.beginTransaction();
session.setFlushMode(FlushMode.COMMIT);
return true;
}
SOAPBody body = null;
try
{
body = smc.getMessage().getSOAPBody();
}
catch (SOAPException e)
{
}
session.flush();
session.setFlushMode(FlushMode.AUTO);
if (body == null || body.hasFault())
{
session.getTransaction().rollback();
}
else
{
session.getTransaction().commit();
}
return true;
}
@Override
public Set<QName> getHeaders()
{
return null;
}
}
欢迎反馈
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:ws="http://jax-ws.dev.java.net/spring/core"
xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.dev.java.net/spring/servlet.xsd">
<bean id="SoapServiceImpl" class="path.to.SOAPServiceImpl" />
<bean id="SoapServiceHandler" class="path.to.SOAPServiceHandler" />
<wss:binding url="/soap">
<wss:service>
<ws:service bean="#SoapServiceImpl">
<ws:handlers>
<ref bean="SoapServiceHandler" />
</ws:handlers>
</ws:service>
</wss:service>
</wss:binding>
</beans>