2015-12-21 99 views
2

我已經使用spring 4.2.4,apache cxf 3.1.4和maven 3.0創建了一個soap web服務。當我嘗試部署應用程序,我得到一個錯誤象下面這樣:無法使用Apache cxf部署Apache Tomcat項目

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pdpservice': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z 
Dec 21, 2015 3:12:34 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
SEVERE: Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pdpservice': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5077) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5591) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z 
    at org.apache.cxf.common.util.SpringAopClassHelper.getRealClassInternal(SpringAopClassHelper.java:85) 
    at org.apache.cxf.common.util.ClassHelper.getRealClass(ClassHelper.java:65) 
    at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:150) 
    at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211) 
    at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:456) 
    at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:334) 
    at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:251) 
    at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:539) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1706) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1645) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    ... 21 more 

當我嘗試調試這我才知道,我的代碼參照下面的類org.springframework.aop.support.AopUtils。 isCglibProxyClass 而不是org.springframework.util.ClassUtils.isCglibProxyClass。

參考: Bean creation throws exception at the build time

我不知道我做錯了什麼。下面給出的pom.xml的

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    ... 
    <properties> 
     <spring.version>4.2.4.RELEASE</spring.version> 
     <cxf.version>3.1.4</cxf.version> 
    </properties> 
    <dependencies> 
    <!-- Spring framework --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-beans</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <!-- Web Service runtime --> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-core</artifactId> 
     <version>${cxf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-bindings-soap</artifactId> 
     <version>${cxf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-frontend-jaxws</artifactId> 
     <version>${cxf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http</artifactId> 
     <version>${cxf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-rs-extension-providers</artifactId> 
     <version>${cxf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-bundle</artifactId> 
     <version>2.7.18</version> 
     <scope>compile</scope> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>*</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.eclipse.jetty</groupId> 
       <artifactId>*</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.apache.geronimo.specs</groupId> 
       <artifactId>*</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-tools-java2ws</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    </dependencies> 
    <build> 
    .... 
    </build> 
</Project> 

我的服務類:

package com.pd.service; 

import java.util.List; 

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 

import com.pd.service.bean.Product; 

@WebService(targetNamespace="http://service.pd.com/") 
public interface PDService { 

    @WebMethod 
    public Product getProduct(@WebParam(name = "arg0") int id); 
    @WebMethod 
    public List<Product> getAllProducts(); 

} 

我的服務類實現:

package com.pd.service.impl; 

import java.util.List; 

import javax.jws.WebService; 

import org.springframework.beans.factory.annotation.Autowired; 

import com.pd.service.PDService; 
import com.pd.service.bean.Product; 
import com.pd.service.dao.PDServiceDAO; 

@WebService(targetNamespace="http://impl.service.pd.com/", endpointInterface="com.pd.service.PDService") 
public class PDServiceImpl implements PDService { 

    @Autowired 
    PDServiceDAO pdServiceDAO; 

    @Override 
    public Product getProduct(int id) { 
     return pdServiceDAO.getProduct(id); 
    } 

    @Override 
    public List<Product> getAllProducts() { 
     return pdServiceDAO.getAllProducts(); 
    } 
} 

能否請你幫我這個。提前致謝。

回答

8

該版本的cxf與Spring 4.2.x不兼容 - 這些方法在Spring 3.1中被棄用,並在Spring 4.2中被刪除。

請參閱the commit here。 CXF需要將方法調用更改爲使用ClassUtils#isCglibProxyClass(Class)

您將需要與CXF人員覈對,看他們是否有一個適用於Spring 4.2的版本。

+0

我使用Apache CXF站點進行了檢查:http://cxf.apache.org/docs/30-migration-guide.html因爲我得到了這個「需要Spring 3.2或更新版本。不贊成使用API​​的調用在Spring 3.x中已被刪除。這使CXF 3.0能夠與Spring 4一起工作,但意味着它不能再與Spring 2.5一起工作。「 –

+0

你能否建議我,爲什麼我的代碼仍然使用不贊成的類。他們的任何問題與我的POM.xml –

+0

我不知道。我只能說這種方法不再存在。我不知道是否存在適用於Spring 4.2的CXF版本。你必須與他們覈對。 –

1

碰撞CXF從2.7.183.2.0爲我解決了這個問題。

CXF需要碰撞到主版本3,它支持Spring 4.2.x

請注意,對於工件cxf束,OP使用CXF 2.7.18。這是造成麻煩的原因。