Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-922

HTTP Conduit configuration is not loaded

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0.1
    • Fix Version/s: 2.0.3
    • Component/s: Configuration
    • Labels:
      None

      Description

      The http conduit config is not been loaded while creating the client using spring configuration. The conduit tlsClientParameters are never set thus the connection to a https address fails.

      This is the spring context file:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:sec="http://cxf.apache.org/configuration/security"
      xmlns:http="http://cxf.apache.org/transports/http/configuration"
      xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
      xsi:schemaLocation="
      http://cxf.apache.org/configuration/security
      http://cxf.apache.org/schemas/configuration/security.xsd
      http://cxf.apache.org/transports/http/configuration
      http://cxf.apache.org/schemas/configuration/http-conf.xsd
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

      <bean id="studentWebServiceClient" class="com.ecot.crm.webservice.client.ws.student.StudentService" factory-bean="studentWebServiceClientFactory" factory-method="create">
      </bean>

      <bean id="studentWebServiceClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
      <property name="serviceClass" value="com.ecot.crm.webservice.client.ws.student.StudentService"/>
      <property name="address" value="$

      {webservices.url}

      /StudentService"/>
      </bean>

      <http:conduit name="

      {http://client.webservice.crm.ecot.com/ws/student}

      StudentService.http-conduit">
      <http:tlsClientParameters>
      </http:tlsClientParameters>
      </http:conduit>
      </beans>

      There is also a post on the mailing list about this, the original messages is this: http://mail-archives.apache.org/mod_mbox/incubator-cxf-user/200708.mbox/%3c2D0EBEA1-B66E-47DD-A0CC-010A2F30ED48@rbxglobal.com%3e

        Activity

        Hide
        njiang Willem Jiang added a comment -

        The conduit name should be the port's Qname + ".http-conduit"

        <http:conduit name="

        {http://client.webservice.crm.ecot.com/ws/student}

        StudentService.http-conduit">

        In your configuration, it looks the http:conduit's name attribute is set to be the service's Qname + ".http-conduit"

        Show
        njiang Willem Jiang added a comment - The conduit name should be the port's Qname + ".http-conduit" <http:conduit name=" {http://client.webservice.crm.ecot.com/ws/student} StudentService.http-conduit"> In your configuration, it looks the http:conduit's name attribute is set to be the service's Qname + ".http-conduit"
        Hide
        jarias Julio Arias added a comment -

        It is the port name, the guy who develop the service put both service name and port name to StudentService. Is that a problem to have the both with the same name?

        Show
        jarias Julio Arias added a comment - It is the port name, the guy who develop the service put both service name and port name to StudentService. Is that a problem to have the both with the same name?
        Hide
        njiang Willem Jiang added a comment -

        I just checked CXF HttpConduit code, and wrote a test case for it. I got the exception that you mentioned.
        CXF uses the bus as the CXF components repository which also holds the configuration object. When we create the client from the JaxWsProxyFactoryBean, the http conduit will be configured by the configuration object from bus.

        The key reason of this issue is that when we create the client bean from the JaxWsProxyFactoryBean by spring, the bus which holds the configuration beans is not create yet, and the JaxWsProxyFactoryBean will use the default bus to create the client. So the customer configuration will not be applied to the http-conduit.

        Here is a way to work around, you separate the configuration beans' spring configuration file with the client bean's spring configuration file.
        Load the bus with the configuration beans' file first , and set the default bus with this created bus. Then create the client bean's context with the client bean's spring configuration file .

        // http conduit configuration file , it supports wildcard
        URL config = getClass().getResource("resources/BethalClientConfig.cxf");
        // the client bean configuration file
        URL beans = getClass().getResource("resources/BethalClientBeans.xml");
        // We go through the back door, setting the default bus.
        new DefaultBusFactory().createBus(config);
        // Init the context which contains the client bean,
        // and we use the already loaded bus to set the configuration
        BusApplicationContext context = new BusApplicationContext(beans, false);
        Greeter bethal = (Greeter)context.getBean("Bethal");
        // verify the client side's setting
        verifyBethalClient(bethal);

        You can find the detail demo code from [1]'s testGetClientFromSpringContext()
        [1]https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/http/HTTPConduitTest.java

        Show
        njiang Willem Jiang added a comment - I just checked CXF HttpConduit code, and wrote a test case for it. I got the exception that you mentioned. CXF uses the bus as the CXF components repository which also holds the configuration object. When we create the client from the JaxWsProxyFactoryBean, the http conduit will be configured by the configuration object from bus. The key reason of this issue is that when we create the client bean from the JaxWsProxyFactoryBean by spring, the bus which holds the configuration beans is not create yet, and the JaxWsProxyFactoryBean will use the default bus to create the client. So the customer configuration will not be applied to the http-conduit. Here is a way to work around, you separate the configuration beans' spring configuration file with the client bean's spring configuration file. Load the bus with the configuration beans' file first , and set the default bus with this created bus. Then create the client bean's context with the client bean's spring configuration file . // http conduit configuration file , it supports wildcard URL config = getClass().getResource("resources/BethalClientConfig.cxf"); // the client bean configuration file URL beans = getClass().getResource("resources/BethalClientBeans.xml"); // We go through the back door, setting the default bus. new DefaultBusFactory().createBus(config); // Init the context which contains the client bean, // and we use the already loaded bus to set the configuration BusApplicationContext context = new BusApplicationContext(beans, false); Greeter bethal = (Greeter)context.getBean("Bethal"); // verify the client side's setting verifyBethalClient(bethal); You can find the detail demo code from [1] 's testGetClientFromSpringContext() [1] https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/http/HTTPConduitTest.java
        Hide
        dkulp Daniel Kulp added a comment -

        Re-opening as a work around is not a fix. The bug still exists.

        Show
        dkulp Daniel Kulp added a comment - Re-opening as a work around is not a fix. The bug still exists.
        Hide
        dkulp Daniel Kulp added a comment -


        I think this is now fixed on trunk, but I would greatly appreciate it if someone could verify.

        Show
        dkulp Daniel Kulp added a comment - I think this is now fixed on trunk, but I would greatly appreciate it if someone could verify.
        Hide
        dkulp Daniel Kulp added a comment -

        I've deployed new snapshots (2.0.3-incubator-SNAPSHOT) that should fix this.

        Show
        dkulp Daniel Kulp added a comment - I've deployed new snapshots (2.0.3-incubator-SNAPSHOT) that should fix this.
        Hide
        ksampson Kyle Sampson added a comment -

        Would this issue affect jms:conduit the same way it affects http:conduit? I've been having problems getting a client using Spring for configuration to contact a server listening via JMS.

        Show
        ksampson Kyle Sampson added a comment - Would this issue affect jms:conduit the same way it affects http:conduit? I've been having problems getting a client using Spring for configuration to contact a server listening via JMS.
        Hide
        njiang Willem Jiang added a comment -

        I think Dan Kulp has already fixed this issue, now the ConfigureImpl can get spring configuration application context and configure it directly to jms:conduit instance.

        Show
        njiang Willem Jiang added a comment - I think Dan Kulp has already fixed this issue, now the ConfigureImpl can get spring configuration application context and configure it directly to jms:conduit instance.
        Hide
        yuj1@mail.neea.edu.cn 余杰 added a comment -

        Hi,willem

        it's about the <http:conduit> configuration using spring ,i saw this bug was fixed in version 2.0.3,but it does throw java.io.IOException: Illegal Protocol https for HTTP URLConnection Factory again.Is there something wrong in my configuration?

        client-https.xml:
        <http:conduit name="

        {http://rr.ets.org/v200512/PingWebService.wsdl}

        PingPort.http-conduit">
        <http:authorization>
        <sec:UserName>usernamehere</sec:UserName>
        <sec:Password>passwordhere</sec:Password>
        </http:authorization>
        <http:tlsClientParameters secureSocketProtocol="SSL">
        </http:tlsClientParameters>
        </http:conduit>

        client-beans.xml
        <bean id="pingClient" class="org.ets.rr.v200512.pingwebservice.PingPort"
        factory-bean="pingClientFactory" factory-method="create" />
        <bean id="pingClientFactory"
        class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="org.ets.rr.v200512.pingwebservice.PingPort" />
        <property name="address" value="https://server/services/PingPort" />
        </bean>

        in the console output,i saw the client-https.xml loaded,nothing wrong happened, and i use the apache-cxf-2.0.3-incubator-SNAPSHOT

        ____ KILL邮件安全网关 已经扫描了这封邮件 ____

        Show
        yuj1@mail.neea.edu.cn 余杰 added a comment - Hi,willem it's about the <http:conduit> configuration using spring ,i saw this bug was fixed in version 2.0.3,but it does throw java.io.IOException: Illegal Protocol https for HTTP URLConnection Factory again.Is there something wrong in my configuration? client-https.xml: <http:conduit name=" {http://rr.ets.org/v200512/PingWebService.wsdl} PingPort.http-conduit"> <http:authorization> <sec:UserName>usernamehere</sec:UserName> <sec:Password>passwordhere</sec:Password> </http:authorization> <http:tlsClientParameters secureSocketProtocol="SSL"> </http:tlsClientParameters> </http:conduit> client-beans.xml <bean id="pingClient" class="org.ets.rr.v200512.pingwebservice.PingPort" factory-bean="pingClientFactory" factory-method="create" /> <bean id="pingClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="org.ets.rr.v200512.pingwebservice.PingPort" /> <property name="address" value="https://server/services/PingPort" /> </bean> in the console output,i saw the client-https.xml loaded,nothing wrong happened, and i use the apache-cxf-2.0.3-incubator-SNAPSHOT ____ KILL邮件安全网关 已经扫描了这封邮件 ____
        Hide
        njiang Willem Jiang added a comment -

        Hi YuJie,

        Please check your http:conduit@name, I saw the name space that you use was "http://rr.ets.org/v200512/PingWebService.wsdl".

        Willem.

        Show
        njiang Willem Jiang added a comment - Hi YuJie, Please check your http:conduit@name, I saw the name space that you use was "http://rr.ets.org/v200512/PingWebService.wsdl". Willem.
        Hide
        yu_jie jie yu added a comment -

        hi,willem

        thanks for your replying,but even i change the http-conduit to <http:conduit name="*.http-conduit">,the same exception was been thrown.
        this is the configuration:

        web.xml:
        <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/client-https.xml,/WEB-INF/client-beans.xml</param-value>
        </context-param>

        <listener>
        <listener-class>
        org.springframework.web.context.ContextLoaderListener
        </listener-class>
        </listener>

        client-beans.xml:
        <bean id="pingClient" class="org.ets.rr.v200512.pingwebservice.PingPort"
        factory-bean="pingClientFactory" factory-method="create" />
        <bean id="pingClientFactory"
        class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="org.ets.rr.v200512.pingwebservice.PingPort" />
        <property name="address" value="https://server/services/PingPort" />
        </bean>

        client-https.xml:
        <http:conduit name="*.http-conduit">
        <http:authorization>
        <sec:UserName>usernamehere</sec:UserName>
        <sec:Password>passwordhere</sec:Password>
        </http:authorization>
        <http:tlsClientParameters secureSocketProtocol="SSL">
        </http:tlsClientParameters>
        </http:conduit>

        and the PingPort source code:
        @WebService(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", name = "PingPort")
        @SOAPBinding(style = SOAPBinding.Style.RPC)

        public interface PingPort {

        @WebResult(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", partName = "response", name = "response")
        @WebMethod
        public java.lang.String ping(
        @WebParam(partName = "request", name = "request")
        java.lang.String request
        );
        }

        the console out put:
        .......
        信息: Refreshing org.springframework.web.context.support.XmlWebApplicationContext@134f69a: display name [Root WebApplicationContext]; startup date [Wed Nov 07 12:57:58 CST 2007]; root of context hierarchy
        2007-11-7 12:57:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
        信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/stpClient-pojo.xml]
        2007-11-7 12:57:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
        信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/client-https.xml]
        2007-11-7 12:58:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
        信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/client-beans.xml]
        2007-11-7 12:58:10 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
        信息: Bean factory for application context [org.springframework.web.context.support.XmlWebApplicationContext@134f69a]: org.springframework.beans.factory.support.DefaultListableBeanFactory@4be2cc
        ......

        is there some i miss?

        Show
        yu_jie jie yu added a comment - hi,willem thanks for your replying,but even i change the http-conduit to <http:conduit name="*.http-conduit">,the same exception was been thrown. this is the configuration: web.xml: <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/client-https.xml,/WEB-INF/client-beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> client-beans.xml: <bean id="pingClient" class="org.ets.rr.v200512.pingwebservice.PingPort" factory-bean="pingClientFactory" factory-method="create" /> <bean id="pingClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="org.ets.rr.v200512.pingwebservice.PingPort" /> <property name="address" value="https://server/services/PingPort" /> </bean> client-https.xml: <http:conduit name="*.http-conduit"> <http:authorization> <sec:UserName>usernamehere</sec:UserName> <sec:Password>passwordhere</sec:Password> </http:authorization> <http:tlsClientParameters secureSocketProtocol="SSL"> </http:tlsClientParameters> </http:conduit> and the PingPort source code: @WebService(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", name = "PingPort") @SOAPBinding(style = SOAPBinding.Style.RPC) public interface PingPort { @WebResult(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", partName = "response", name = "response") @WebMethod public java.lang.String ping( @WebParam(partName = "request", name = "request") java.lang.String request ); } the console out put: ....... 信息: Refreshing org.springframework.web.context.support.XmlWebApplicationContext@134f69a: display name [Root WebApplicationContext] ; startup date [Wed Nov 07 12:57:58 CST 2007] ; root of context hierarchy 2007-11-7 12:57:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/stpClient-pojo.xml] 2007-11-7 12:57:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/client-https.xml] 2007-11-7 12:58:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/client-beans.xml] 2007-11-7 12:58:10 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 信息: Bean factory for application context [org.springframework.web.context.support.XmlWebApplicationContext@134f69a] : org.springframework.beans.factory.support.DefaultListableBeanFactory@4be2cc ...... is there some i miss?
        Hide
        yuj1@mail.neea.edu.cn 余杰 added a comment -

        hi,willem

        thanks for your replying,but even i change the http-conduit to <http:conduit name="*.http-conduit">,the same exception was also been thrown.here is my configuration:

        web.xml:
        <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/client-https.xml,/WEB-INF/client-beans.xml</param-value>
        </context-param>

        <listener>
        <listener-class>
        org.springframework.web.context.ContextLoaderListener
        </listener-class>
        </listener>

        client-https.xml:
        <http:conduit name="*.http-conduit">
        <http:authorization>
        <sec:UserName>usernamehere</sec:UserName>
        <sec:Password>passwordhere</sec:Password>
        </http:authorization>
        <http:tlsClientParameters secureSocketProtocol="SSL">
        </http:tlsClientParameters>
        </http:conduit>

        client-beans.xml:
        <bean id="pingClient" class="org.ets.rr.v200512.pingwebservice.PingPort"
        factory-bean="pingClientFactory" factory-method="create" />
        <bean id="pingClientFactory"
        class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="org.ets.rr.v200512.pingwebservice.PingPort" />
        <property name="address" value="https://server/services/PingPort" />
        </bean>

        and the PingPort source code:
        @WebService(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", name = "PingPort")
        @SOAPBinding(style = SOAPBinding.Style.RPC)

        public interface PingPort {
        @WebResult(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", partName = "response", name = "response")
        @WebMethod
        public java.lang.String ping(
        @WebParam(partName = "request", name = "request")
        java.lang.String request
        );
        }

        is there something i miss?

        ____ KILL邮件安全网关 已经扫描了这封邮件 ____

        Show
        yuj1@mail.neea.edu.cn 余杰 added a comment - hi,willem thanks for your replying,but even i change the http-conduit to <http:conduit name="*.http-conduit">,the same exception was also been thrown.here is my configuration: web.xml: <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/client-https.xml,/WEB-INF/client-beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> client-https.xml: <http:conduit name="*.http-conduit"> <http:authorization> <sec:UserName>usernamehere</sec:UserName> <sec:Password>passwordhere</sec:Password> </http:authorization> <http:tlsClientParameters secureSocketProtocol="SSL"> </http:tlsClientParameters> </http:conduit> client-beans.xml: <bean id="pingClient" class="org.ets.rr.v200512.pingwebservice.PingPort" factory-bean="pingClientFactory" factory-method="create" /> <bean id="pingClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="org.ets.rr.v200512.pingwebservice.PingPort" /> <property name="address" value="https://server/services/PingPort" /> </bean> and the PingPort source code: @WebService(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", name = "PingPort") @SOAPBinding(style = SOAPBinding.Style.RPC) public interface PingPort { @WebResult(targetNamespace = "http://rr.ets.org/v200512/PingWebService.wsdl", partName = "response", name = "response") @WebMethod public java.lang.String ping( @WebParam(partName = "request", name = "request") java.lang.String request ); } is there something i miss? ____ KILL邮件安全网关 已经扫描了这封邮件 ____
        Hide
        njiang Willem Jiang added a comment -

        Hi YuJie,

        You just need to import the client-https.xml in the client-beans.xml. The configuration will take effect within CXF 2.0.3.

        Willem.

        Show
        njiang Willem Jiang added a comment - Hi YuJie, You just need to import the client-https.xml in the client-beans.xml. The configuration will take effect within CXF 2.0.3. Willem.

          People

          • Assignee:
            dkulp Daniel Kulp
            Reporter:
            jarias Julio Arias
          • Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development