Hi Freeman!
Freeman Fang пишет:
Please append your whole wsdl
Ok. Lets simplify our task for the best understanding important things.
I've created simple service MyService and written MyServiceImpl.
Here is my service.wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://mycompany/My"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="http://schemas.xmlsoap.org/soap/encoding/"
targetNamespace="http://mycompany/My">
<wsdl:types>
<xsd:schema targetNamespace="http://mycompany/My"
attributeFormDefault="qualified"
elementFormDefault="qualified">
<xsd:element name="RequestMessage">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="input"
type="xsd:string" />
<xsd:element name="input2"
type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ResponseMessage">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="output"
type="xsd:string" />
<xsd:element name="output2"
type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="requestMessage">
<wsdl:part name="request"
element="tns:RequestMessage">
</wsdl:part>
</wsdl:message>
<wsdl:message name="responseMessage">
<wsdl:part name="result"
element="tns:ResponseMessage">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="MyServiceInterface">
<wsdl:operation name="getInfo">
<wsdl:input message="tns:requestMessage">
</wsdl:input>
<wsdl:output message="tns:responseMessage">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="MyServicePortBinding"
type="tns:MyServiceInterface">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getInfo">
<soap:operation soapAction="" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MyService">
<wsdl:port name="MyServicePort"
binding="tns:MyServicePortBinding">
<soap:address location="http://localhost:8192/myservice/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
And here is MyServiceImpl:
package mycompany.my;
import javax.jws.WebService;
@WebService(serviceName="MyService",
targetNamespace="http://myservice/My",
portName="MyServicePort",
endpointInterface="mycompany.my.MyServiceInterface")
public class MyServiceImpl implements MyServiceInterface{
public ResponseMessage getInfo(RequestMessage request) {
ResponseMessage responseMessage = new ResponseMessage();
responseMessage.setOutput(request.getInput().concat("!"));
responseMessage.setOutput2(request.getInput2().concat("!"));
return responseMessage;
}
}
And this is my CxfBcProviderConsumerTest:
package mycompany.my;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.service.model.ServiceInfo;
import org.apache.servicemix.tck.SpringTestSupport;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CxfBcProviderConsumerTest extends SpringTestSupport {
public void testBridge() throws Exception {
URL wsdl = getClass().getResource("/service.wsdl");
// start external service
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(MyServiceInterface.class);
factory.setServiceBean(new MyServiceImpl());
factory.setWsdlURL(wsdl.toString());
factory.setServiceName(new QName("http://mycompany/My",
"MyService"));
//factory.setBindingId("http://schemas.xmlsoap.org/wsdl/soap12/");
String address = "http://localhost:9001/bridgetest";
factory.setAddress(address);
Server server = factory.create();
Endpoint endpoint = server.getEndpoint();
endpoint.getInInterceptors().add(new LoggingInInterceptor());
endpoint.getOutInterceptors().add(new LoggingOutInterceptor());
ServiceInfo service = endpoint.getEndpointInfo().getService();
assertNotNull(service);
// start external client
assertNotNull(wsdl);
MyService service1 = new MyService(wsdl,
new QName("http://mycompany/My", "MyService"));
MyServiceInterface port = service1.getMyServicePort();
RequestMessage requestMessage = new RequestMessage();
requestMessage.setInput("input1");
requestMessage.setInput2("input2");
ResponseMessage responseMessage = port.getInfo(requestMessage);
System.err.println(responseMessage.getOutput());
System.err.println(responseMessage.getOutput2());
assertNotNull(responseMessage);
}
@Override
protected AbstractXmlApplicationContext createBeanFactory() {
return new ClassPathXmlApplicationContext(
"my_cxf_provider_consumer_bridge.xml");
}
}
-----------------my_cxf_provider_consumer_bridge.xml----------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
xmlns:my="http://mycompany/My">
<sm:container id="jbi" embedded="true">
<sm:endpoints>
<cxfbc:consumer wsdl="/service.wsdl"
service="my:MyService"
endpoint="MyPort"
targetEndpoint="MyPortProxy"
targetService="my:MyService"
targetInterface="my:MyServiceInterface">
<cxfbc:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</cxfbc:inInterceptors>
<cxfbc:outInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
</cxfbc:outInterceptors>
<cxfbc:inFaultInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</cxfbc:inFaultInterceptors>
<cxfbc:outFaultInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
</cxfbc:outFaultInterceptors>
</cxfbc:consumer>
<cxfbc:provider wsdl="/service.wsdl"
locationURI="http://localhost:9001/bridgetest"
service="my:MyService"
endpoint="MyPortProxy"
interfaceName="my:MyServiceInterface"
>
<cxfbc:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</cxfbc:inInterceptors>
<cxfbc:outInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
</cxfbc:outInterceptors>
<cxfbc:inFaultInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</cxfbc:inFaultInterceptors>
<cxfbc:outFaultInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
</cxfbc:outFaultInterceptors>
</cxfbc:provider>
</sm:endpoints>
</sm:container>
</beans>
When I start test I faced new issue (Exception):
testBridge(mycompany.my.CxfBcProviderConsumerTest) Time elapsed: 0.515
sec <<< ERROR!
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:
Line 4 in XML document from class path resource
[my_cxf_provider_consumer_bridge.xml] is invalid; nested exception is
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of
element 'beans'.
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the
declaration of element 'beans'.
at
org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown
Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown
Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown
Source)
at
org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown
Source)
at
org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown
Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown
Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at
org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:351)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:280)
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:131)
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:147)
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:173)
at
org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:112)
at
org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:79)
at
org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:100)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:313)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:91)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:75)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:65)
at
mycompany.my.CxfBcProviderConsumerTest.createBeanFactory(CxfBcProviderConsumerTest.java:81)
at
org.apache.servicemix.tck.SpringTestSupport.setUp(SpringTestSupport.java:65)
...
-----xbean.xml----
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:cxfse="http://servicemix.apache.org/cxfse/1.0">
<cxfse:endpoint>
<cxfse:pojo>
<bean class="mycompany.my.MyServiceImpl" />
</cxfse:pojo>
</cxfse:endpoint>
</beans>
I used ServiceMix's CxfBcProviderConsumerTest as example.
Thanks in advance!
Truly yours, Ivan Pryvalov.