我打算在eclipse上的一个maven项目的某一个类发布,成为web service,打算使用cxf进行发布。
最初这个测试用的maven项目是这样的:
也就是说,在导入cxf之前,这个maven项目的功能是可以正常运行的,我的maven中有一个类名为YankDAO.java
我采用testNG进行测试,创建YankDAO的实例,执行它的方法,方法的内容是读取eclipse同一台PC上的mysql中的数据,然后console中显示这些数据。
其中testNG的测试代码的内容如下:
package com.webservice.spring.DAO;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.testng.annotations.Test;
import com.webservice.spring.domain.Yank;
@ContextConfiguration("classpath*:/WebServiceApplicationContext.xml")
public class YankDAOTest extends AbstractTransactionalTestNGSpringContextTests{
private YankDAO yd;
@Autowired
public void setYd(YankDAO yd) {
this.yd = yd;
}
@Test
public void f() {
String st1 = yd.testF();
List<Yank> lk1 = yd.getMenu();
for (int i = 0; i < lk1.size(); i++) {
Yank yk1 = lk1.get(i);
System.out.println(yk1.getsCoffee());
System.out.println("--------------");
System.out.println(yk1.getsHouse());
}
}
}
上述代码,加载了一个spring的配置文件,该配置文件配置了一个可以访问本地mysql的数据源,并且向spring容器注册了JDBCTemplate的bean。我们的YankDAO.java代码中注入了这个bean并且利用它访问mysql数据库。
其中spring配置文件名为WebServiceApplicationContext.xml
这个文件放在了maven项目的resources文件夹下,默认情况,spring容器会访问这个文件夹,读取配置文件。
配置文件的代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 集成hibernate之后的Spring的applicationContext配置文件 -->
<!-- mysql dao和service层的Spring配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
classpath:/org/springframework/beans/factory/xml/spring-beans.xsd
http://www.springframework.org/schema/context
classpath:/org/springframework/context/config/spring-context.xsd
http://www.springframework.org/schema/aop
classpath:/org/springframework/aop/config/spring-aop.xsd
http://www.springframework.org/schema/tx
classpath:/org/springframework/transaction/config/spring-tx.xsd
http://www.springframework.org/schema/jdbc
classpath:/org/springframework/jdbc/config/spring-jdbc.xsd
http://www.springframework.org/schema/mvc
classpath:/org/springframework/web/servlet/config/spring-mvc.xsd">
<!--
http://cxf.apache.org/core
classpath:/schemas/core.xsd
http://cxf.apache.org/jaxws
classpath:/schemas/jaxws.xsd
-->
<context:component-scan base-package="com.webservice.spring.DAO"/>
<!--com.mysql.cj.jdbc.Driver-->
<!--配置文件-->
<bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/WebServiceApplicationContext.properties</value>
</list>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionmanager"/>
<!-- 配置mysql数据源, 阿里巴巴的druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:initialSize="${ds.initialSize}"
p:minIdle="${ds.minIdle}"
p:maxActive="${ds.maxActive}"
p:maxWait="${ds.maxWait}"
p:timeBetweenEvictionRunsMillis="${ds.timeBetweenEvictionRunsMillis}"
p:minEvictableIdleTimeMillis="${ds.minEvictableIdleTimeMillis}"
p:removeAbandoned="${ds.removeAbandoned}"
p:removeAbandonedTimeout="${ds.removeAbandonedTimeout}"
p:defaultAutoCommit="true">
</bean>
<!-- spring为集成hibernate提供的LocalSessionFactoryBean -->
<!-- 指定数据源 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="com.tsmi.hibernate.entity"/>
</bean>
<!-- 配置Hibernate的事务管理器 : 注入SessionFactory 会话工厂 -->
<bean id="transactionmanager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- -->
<!-- 配置JdbcTemplate -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
上述功能是spring通过jdbctemplate访问mysql的简单实现,也跑通了。
下面我们要为我们的项目导入cxf的jar环境
导入,我们之前下载并放置在c盘根目录下的cxf,而且我们也配置了系统环境变量
但是导入之后就开始报错
表明,我们maven项目pom中导入的jar和单独为项目build path导入的jar发生了冲突。
这个时候,如果我们为了不要报错,单方面去pom.xml中注释掉一些jar,确实可以让makers中的报错消失。
这时,原本可以运行的testNG的代码,运行起来会报错:
Caused by: java.lang.NoSuchMethodError: org.springframework.util.Assert.notNull(Ljava/lang/Object;Ljava/util/function/Supplier;)V
at org.springframework.test.context.support.ContextLoaderUtils.resolveContextConfigurationAttributes(ContextLoaderUtils.java:240)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:304)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:109)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:135)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)
at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.<init>(AbstractTestNGSpringContextTests.java:112)
at org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests.<init>(AbstractTransactionalTestNGSpringContextTests.java:82)
at com.webservice.spring.DAO.YankDAOTest.<init>(YankDAOTest.java:13)
... 26 more