Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate SOAP服务器实现中的事务管理_Hibernate_Spring_Session_Soap - Fatal编程技术网

Hibernate SOAP服务器实现中的事务管理

Hibernate SOAP服务器实现中的事务管理,hibernate,spring,session,soap,Hibernate,Spring,Session,Soap,我有一个标准的jax-ws-webservice设置,它使用Spring进行DI,使用Hibernate进行持久化。现在,在春季,您通常会将请求包装在自定义筛选器中,并在Hibernate会话上执行beginTransaction()和commit()/rollback(),具体取决于执行是否顺利进行 然而,对于soapweb客户机,没有使用这个执行链,因此不能像这样轻松地设置事务管理。当然,我也希望避免将我的@WebMethod实现包装在 session.beginTransaction();

我有一个标准的jax-ws-webservice设置,它使用Spring进行DI,使用Hibernate进行持久化。现在,在春季,您通常会将请求包装在自定义筛选器中,并在Hibernate会话上执行
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>