복붙노트

[SPRING] Apache Tomcat에서 apache cxf를 사용하여 프로젝트를 배포 할 수 없습니다.

SPRING

Apache Tomcat에서 apache cxf를 사용하여 프로젝트를 배포 할 수 없습니다.

스프링 4.2.4, apache cxf 3.1.4 및 maven 3.0을 사용하여 비누 웹 서비스를 만들었습니다. 응용 프로그램을 배포하려고하면 아래와 같은 오류가 발생합니다.

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 대신에.

참고: 빈 작성시 빌드시 예외가 발생 함

나는 내가 뭘 잘못했는지 모른다. 아래 주어진 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();
    }
}

이걸 좀 도와주세요. 미리 감사드립니다.

해결법

  1. ==============================

    1.해당 버전의 cxf는 Spring 4.2.x와 호환되지 않습니다. 이러한 메소드는 Spring 3.1에서 사용되지 않으며 Spring 4.2에서 제거되었습니다.

    해당 버전의 cxf는 Spring 4.2.x와 호환되지 않습니다. 이러한 메소드는 Spring 3.1에서 사용되지 않으며 Spring 4.2에서 제거되었습니다.

    여기에 커밋을 참조하십시오. CXF는 ClassUtils # isCglibProxyClass (Class)를 사용하기 위해 메소드 호출을 변경해야합니다.

    Spring 4.2에서 작동하는 버전이 있는지 CXF 담당자에게 확인해야합니다.

  2. ==============================

    2.2.7.18에서 3.2.0으로 CXF가 부딪쳐서이 문제가 해결되었습니다.

    2.7.18에서 3.2.0으로 CXF가 부딪쳐서이 문제가 해결되었습니다.

    CXF는 Spring 4.2.x를 지원하는 메이저 버전 3에 부딪 힐 필요가있다.

    OP는 artifact cxf-bundle에 CXF 2.7.18을 사용했습니다. 이것이 문제의 원인이었습니다.

  3. ==============================

    3.CXF 2.7.18을 계속 사용하면서이 문제를 방지하는 또 다른 방법은 -Dorg.apache.cxf.useSpringClassHelpers = false 시스템 속성을 추가하는 것입니다. 이렇게하면 CXF가 Spring 도우미 사용을 피하게되므로 문제가 사라집니다.

    CXF 2.7.18을 계속 사용하면서이 문제를 방지하는 또 다른 방법은 -Dorg.apache.cxf.useSpringClassHelpers = false 시스템 속성을 추가하는 것입니다. 이렇게하면 CXF가 Spring 도우미 사용을 피하게되므로 문제가 사라집니다.

    CXF 2.7.18은 고대 버전이며 취약성이 수정되지 않았으며 또 다른 해결책이 제시하는대로 최신 버전으로 업그레이드하는 것이 가장 좋은 방법이라는 점에 유의하십시오.

  4. ==============================

    4.3.2.0으로 apache cxf로 업그레이드하면 Spring Framework 5.0.1의 문제가 해결되었습니다.

    3.2.0으로 apache cxf로 업그레이드하면 Spring Framework 5.0.1의 문제가 해결되었습니다.

  5. from https://stackoverflow.com/questions/34393291/unable-to-deploy-the-project-in-apache-tomcat-with-apache-cxf by cc-by-sa and MIT license