Клиент CXF: не найден инициатор канала для ошибки пространства имен

#web-services #rest #cxf #cxf-client

#веб-службы #rest #cxf #cxf-client

Вопрос:

Я использую CXF 3.0 для создания веб-службы restful. Мой веб-сервис работает нормально, но мой клиент cxf выдает исключение, показанное ниже

     [qtp392289808-96] WARN org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {http://localhost:8080/userdetailservice}WebClient has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No conduit initiator was found for the namespace http://cxf.apache.org/transports/http.
    at org.apache.cxf.endpoint.AbstractConduitSelector.getSelectedConduit(AbstractConduitSelector.java:116)
    at org.apache.cxf.endpoint.UpfrontConduitSelector.selectConduit(UpfrontConduitSelector.java:77)
    at org.apache.cxf.message.ExchangeImpl.getConduit(ExchangeImpl.java:148)
    at org.apache.cxf.interceptor.MessageSenderInterceptor.getConduit(MessageSenderInterceptor.java:71)
    at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:620)
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1087)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:882)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:853)
    at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:320)
    at org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:329)
    at com.sell.mystuff.web.service.impl.UserInfoServiceImpl.processCredentials(UserInfoServiceImpl.java:47)
  

Ниже приведен мой код:

 @Resource(name = "cxfWebClient")
    private WebClient restClient;

private UserDetail processCredentials(UserAuthenticationRequest userData)
            throws AuthenticationException {
    try {
        LOGGER.debug("About to authenticate the user {1}",
                userData.getUsername());
        addCommonAttributes(WebConstants.AUTHENTICATE_URL);
        LOGGER.info("About to make a restful call to the userDetailService for user {}", userData.getUsername());
        Response response = restClient.post(userData);
        LOGGER.info("Got the response back from userDetailService");
        UserDetail authenticatedData = response
                .readEntity(UserDetail.class);
        if (authenticatedData == null
                || authenticatedData.getUsername() == null) {
            throw new SellServiceException(
                    StatusCodes.AUTHENTICATION_ERROR_CODE);
        }
        return authenticatedData;
    } catch (RuntimeException ex) {
        LOGGER.error("Error in the processCredentials()", ex);
        throw new SellServiceException(
                StatusCodes.AUTHENTICATION_ERROR_CODE);
    }

}

private void addCommonAttributes(String url) {
        restClient.path(url);
        restClient.accept(MediaType.APPLICATION_JSON).type(
                MediaType.APPLICATION_XML);

    }
  

POM.xml файл

 <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-search</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-providers</artifactId>
        <version>3.0.0</version>
    </dependency>
  

Я думаю, что мне не хватает важной зависимости maven, но не уверен, какой именно. Может ли кто-нибудь помочь мне в этом отношении?

Ответ №1:

После некоторой борьбы я смог реализовать решение. Решением было настроить JacksonJaxbJsonProvider в cxfWebClient, как показано ниже:

 <beans:bean id="myJsonProvider"
    class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
</beans:bean>

<util:list id="webClientProviders">
    <beans:ref bean="myJsonProvider" />
</util:list>
<beans:bean id="cxfWebClient" class="org.apache.cxf.jaxrs.client.WebClient"
        factory-method="create">
        <beans:constructor-arg type="java.lang.String"
            value="${userDetailService.base.url}" />
        <beans:constructor-arg ref="webClientProviders" />
    </beans:bean>