eclipse上cxf与testNG的冲突

  1. 云栖社区>
  2. 博客>
  3. 正文

eclipse上cxf与testNG的冲突

pandamonica 2018-09-07 15:14:02 浏览602 评论0

摘要: 我打算在eclipse上的一个maven项目的某一个类发布,成为web service,打算使用cxf进行发布。最初这个测试用的maven项目是这样的:也就是说,在导入cxf之前,这个maven项目的功能是可以正常运行的,我的maven中有一个类名为YankDAO.java我采用testNG进行测试,创建YankDAO的实例,执行它的方法,方法的内容是读取eclipse同一台PC上的mysql中的数据,然后console中显示这些数据。

我打算在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

_

【云栖快讯】一站式开发者服务,海量学习资源免费学  详情请点击

网友评论