Созданный CXF клиент HandlerTubeFactory не реализует TubeFactory

Я использую wsdl2java для создания клиента. Когда я запускаю этот клиент, я получаю

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

Спасибо 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);
    }

person oldDave    schedule 04.01.2017    source источник


Ответы (1)


Трассировка стека ошибок показывает, что клиент использует встроенные классы 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 действительно развернуты на вашем сервере и находятся по адресу время исполнения

person pedrofb    schedule 04.01.2017
comment
Я включаю зависимости, определенные на веб-сайте CXF, как показано выше. Я не знаю, как остановить это, используя классы com.sun.xml.internal.ws. * Вместо эквивалентов CXF. - person oldDave; 05.01.2017
comment
JVM выбирает путь к классам сканирования реализации JAX-WS в поисках javax.xml.ws.spi.Provider См. stackoverflow.com/questions/6364333/ Поставщик CXF находится в cxf-rt-frontend-jaxws-*.jar, поэтому наиболее вероятно Причина вашей проблемы в том, что jar неправильно развернут и отсутствует в пути к классам. Убедитесь, что maven и среда выполнения работают должным образом - person pedrofb; 05.01.2017