前几天写的是用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中的事务问题算是解决了.