2017-01-04 7 views
0

저는 wsdl2java를 사용하여 클라이언트를 생성합니다.CXF가 생성 한 클라이언트 HandlerTubeFactory가 TubeFactory를 구현하지 않습니다.

URL eapURL = UkIdentityFraudService.WSDL_LOCATION; 
UkIdentityFraudService ss = new UkIdentityFraudService(eapURL, EPA_SERVICE_NAME); 
epaPort = ss.getUkIdentityFraudServiceHttpPort(); 
Map<String, Object> epaOutProps = new HashMap<String, Object>(); 
Client client = org.apache.cxf.frontend.ClientProxy.getClient(epaPort); 
Endpoint epaCxfEndpoint = client.getEndpoint(); 
epaOutProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
epaOutProps.put(WSHandlerConstants.USER, epauser); 
epaOutProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST); 
epaOutProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, EpaPasswordCallback.class.getName()); 
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(epaOutProps); 
epaCxfEndpoint.getOutInterceptors().add(wssOut); 
epaCxfEndpoint.getInInterceptors().add(new LoggingInInterceptor()); 
epaCxfEndpoint.getOutInterceptors().add(new LoggingOutInterceptor()); 
:이 클라이언트를 실행하면 나는 여기
<dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-frontend-jaxws</artifactId> 
     <version>3.1.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http</artifactId> 
     <version>3.1.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.wss4j</groupId> 
     <artifactId>wss4j-ws-security-common</artifactId> 
     <version>2.1.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-ws-security</artifactId> 
     <version>3.1.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-bindings-soap</artifactId> 
     <version>3.1.7</version> 
    </dependency> 

내 클라이언트 코드입니다 (너무 많은 모두 표시되지 않는)

java.lang.RuntimeException: MASM0015: Class [ com.sun.xml.ws.assembler.jaxws.HandlerTubeFactory ] does not implement [ com.sun.xml.internal.ws.assembler.dev.TubeFactory ] interface 
at com.sun.xml.internal.ws.assembler.TubeCreator.<init>(TubeCreator.java:63) 
at com.sun.xml.internal.ws.assembler.TubelineAssemblyController.initializeTubeCreators(TubelineAssemblyController.java:116) 
at com.sun.xml.internal.ws.assembler.TubelineAssemblyController.getTubeCreators(TubelineAssemblyController.java:79) 
at com.sun.xml.internal.ws.assembler.MetroTubelineAssembler.createClient(MetroTubelineAssembler.java:103) 
at com.sun.xml.internal.ws.client.Stub.createPipeline(Stub.java:328) 
at com.sun.xml.internal.ws.client.Stub.<init>(Stub.java:295) 
at com.sun.xml.internal.ws.client.Stub.<init>(Stub.java:228) 
at com.sun.xml.internal.ws.client.Stub.<init>(Stub.java:243) 
at com.sun.xml.internal.ws.client.sei.SEIStub.<init>(SEIStub.java:84) 
at com.sun.xml.internal.ws.client.WSServiceDelegate.getStubHandler(WSServiceDelegate.java:814) 
at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:803) 
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:436) 
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:404) 
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:386) 
at javax.xml.ws.Service.getPort(Service.java:119) 
at com.equifax.eid.soap.schema.ukidentityfraudservice.v1.wsdl.UkIdentityFraudService.getUkIdentityFraudServiceHttpPort(UkIdentityFraudService.java:72) 

내 pom.xml 파일은 다음과 같은 관련 종속성을 포함 얻을

생성 된 서비스 코드의 맨 위 부분은 다음과 같습니다.

import java.net.MalformedURLException; 
import java.net.URL; 
import javax.xml.namespace.QName; 
import javax.xml.ws.WebEndpoint; 
import javax.xml.ws.WebServiceClient; 
import javax.xml.ws.WebServiceFeature; 
import javax.xml.ws.Service; 

/** 
* This class was generated by Apache CXF 3.1.7 
* 2017-01-04T10:48:02.103Z 
* Generated source version: 3.1.7 
* 
*/ 

pedrofb에 감사드립니다. 나는 ServiceDelegate를 명시 적으로 오버라이드하고, 이것을 코드에 추가하고, 큰 try catch 블록 안에 추가함으로써 작동하도록 할 수 있습니다.

Field delegateField = Service.class.getDeclaredField("delegate"); //ALLOW CXF SPECIFIC SERVICE DELEGATE ONLY! 
    delegateField.setAccessible(true); 
    ServiceDelegate previousDelegate = (ServiceDelegate) delegateField.get(ss); 
    if (!previousDelegate.getClass().getName().contains("cxf")) { 
     ServiceDelegate serviceDelegate = ((Provider) Class.forName("org.apache.cxf.jaxws.spi.ProviderImpl").newInstance()) 
      .createServiceDelegate(epaLoc, EPA_SERVICE_NAME, ss.getClass()); 
     logger.info("The " + getClass().getSimpleName() + " delegate is changed from " + "[" + previousDelegate + "] to [" + 
      serviceDelegate + 
      "]"); 
     delegateField.set(ss, serviceDelegate); 
    } 

답변

3

오류 스택 트레이스는 클라이언트가 사용하고 있음을 보여줍니다 JRE JAX-WS가 내장 클래스 대신 CXF 클래스의 com.sun.xml.internal.ws.*.

JVM은 javax.xml.ws.spi.Provider을 찾는 JAX-WS 구현 클래스 경로 검색을 선택합니다. CXF 공급자는 cxf-rt-frontend-jaxws-*.jar에 있으므로 가장 많이 발생하는 이유는 jar이 올바르게 배포되지 않았고 클래스 경로에 존재하지 않기 때문입니다.

CXF dependencies 정말 실행시 서버에 배치 발견되어 있는지 확인

+0

내가 위에서와 같이 CXF 웹 사이트에 정의 된 종속 관계를 포함 할. CXF에 상응하는 클래스 대신 com.sun.xml.internal.ws. * 클래스를 사용하여 중지하는 방법을 모르겠습니다. – csDave

+0

JVM은'javax.xml.ws.spi.Provider'를 찾을 JAX-WS 구현 검색 클래스 경로를 선택합니다. http://stackoverflow.com/questions/6364333/jax-ws-when-apache-cxf-is-installed- it-steals-default-jdk-jax-ws-implementat CXF 제공자는'cxf-rt-frontend-jaxws - *. jar'에 있습니다. 그래서 문제의 가장 큰 이유는 jar가 올바르게 배치되지 않았기 때문입니다. classpath에 있습니다. Maven과 실행 환경이 예상대로 실행되는지 확인 – pedrofb