2017-01-04 14 views
0

Я использую wsdl2java для создания клиента. Когда я запускаю этот клиент я получаюСозданный CXF клиент HandlerTubeFactory не реализует TubeFactory

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 включает в себя следующие соответствующие зависимости (не показывая все как слишком много)

<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> 

Вот мой код клиента:

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()); 

Основная информация о сервисе Код:

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 
* 
*/ 

Спасибо, педрофб. Я мог бы заставить его работать, явно переопределяя ServiceDelegate, добавив это в мой код внутри большого блока catch try.

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

StackTrace ошибка показывает, что клиент использует JRE JAX-WS встроенных классов com.sun.xml.internal.ws.* вместо классов CxF.

JVM выбирает путь реализации класса JAX-WS для поиска javax.xml.ws.spi.Provider. Поставщик CXF находится в cxf-rt-frontend-jaxws-*.jar, поэтому наиболее вероятной причиной этого является то, что jar неправильно развернуто и нет в пути к классам.

Обеспечить CXF dependencies действительно развернуты на сервере и нашел во время выполнения

+0

я включаю зависимости, определенные на сайте CXF, как показано выше. Я не знаю, как остановить его, используя классы com.sun.xml.internal.ws. * Вместо эквивалентов CXF. – csDave

+0

JVM выбирает путь реализации класса JAX-WS для поиска 'javax.xml.ws.spi.Provider' См. 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

 Смежные вопросы

  • Нет связанных вопросов^_^