spring普通项目发布webservice,以及webservice事务问题

本文介绍了在普通Spring项目中使用CXF框架发布Webservice时遇到的事务管理问题。通过手动配置,解决了因无法在Webservice接口实现类上使用@Service注解而无法利用@Transactional注解进行事务管理的难题。最终通过QueryRunner和数据源解决事务操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天写的是用springboot发布webservice 点击跳转 这次是普通spring项目

使用的是cxf框架
1.导入maven 跟boot一样

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.1.12</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.1.12</version>
</dependency>

2.修改web.xml 在文件末尾加入:

<!-- cxf服务启动servlet -->
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <!--这里是webservice访问路径-->
        <url-pattern>/webservice/*</url-pattern>
    </servlet-mapping>

3.修改配置文件
在WEB-INF下面创建 cxf-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xmlns:cxf="http://cxf.apache.org/core"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
       http://cxf.apache.org/core
       http://cxf.apache.org/schemas/core.xsd
       http://cxf.apache.org/jaxws
       http://cxf.apache.org/schemas/jaxws.xsd
       http://cxf.apache.org/jaxrs
       http://cxf.apache.org/schemas/jaxrs.xsd
       http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util-3.1.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<!--这两个导入不用管,是自动导入-->
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

	<!--这里是webservice的接口实现类,在方法中使用了数据源,所以在这里注入-->
	<!--数据源在spring的配置文件 application.xml中已经定义了,这里可以直接引用-->
    <bean id="serviceImpl" class="com.yonyougov.bd.common.service.meta.webservice.MetaDataWebServiceImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
	<!--发布服务,这里有多种方式,可以上网查询,选用一种即可-->
    <jaxws:endpoint id="metaDataWebServiceImpl" implementor="#serviceImpl" address="/test"/>
    <!--<jaxws:server id="metaWebService" address="test" serviceClass="com.yonyougov.bd.common.service.meta.webservice.IMetaDataWebService"/>-->

</beans>

4.编写接口和实现类,加上注解,这里和boot中的一样,不再重复.

遇到的问题:

就是发布服务后,有一个方法是插入数据到数据库, 客户端调用方法时, 可以传输过来数据,
但是插入数据时需要事务.
跟数据库交互我使用的是entityManager. 因为数据库中的表是变动的,无法创建dao,
只能使用sql语句插入. 所以选用了entityManager .
这时出现了问题, 用spring的事务注解@Transactional 不好使, 说这个注解只能用在@servcie注解标注的类上, 但是webservice接口的实现类使用@service注解不好使.
不能用注解事务, 我就是entityManager手动开启事务, 提交事务, 但是依然不好使, 报错. 错误说在spring要使用spring的注解事务,但是注解事务明明不好使.

折腾了半天, 想到了以前的queryrunner,传输数据源就不用我们关心事务的问题了.
所以在实现类中注入了数据源, 因为没有使用@Service注解, 所以不能使用@Autowired注入.只能在配置文件中注入.
之后在方法中使用 QueryRunner qr = new QueryRunner(dataSource);
就可以进行各种操作了

webservice中的事务问题算是解决了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值