Générer une requête soap à l'aide de Chameau
Je veux l'appeler tiers webservice de chameau à l'aide de fichier wsdl sans génération de code client(parce que je pense que si je suis en fournissant fichier wsdl puis chameau en mesure de générer des clients que nous avons déjà générer et qui travaille dans notre vieux code)
Après avoir cherché longtemps, j'ai trouvé un code qui m'aide à atteindre mon objectif
code est
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.dataformat.soap.Soap11DataFormatAdapter;
import org.apache.camel.dataformat.soap.Soap12DataFormatAdapter;
import org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.dataformat.SoapJaxbDataFormat;
import com.camel.model.Application;
public class TestMain {
static CamelContext context;
public static void main(String args[]) throws Exception {
CamelContext context = new DefaultCamelContext();
ProducerTemplate template = context.createProducerTemplate(0);
context.start();
String url="cxf://http://localhost:8081/buzzor-service/services/ApplicationService?" +
"wsdlURL=http://localhost:8081/buzzor-service/services/ApplicationService?wsdl&" +
"serviceName={http://service.application.buzzor.atpl.com}ApplicationService&" +
"portName={http://service.application.buzzor.atpl.com}ApplicationServiceHttpPort&" +
"dataFormat=MESSAGE";
Exchange reply = sendSimpleMessage(template, url);
org.apache.camel.Message out = reply.getOut();
String result = out.getBody(String.class);
System.out.println(result);
Thread.sleep(10000);
context.stop();
}
private static Exchange sendSimpleMessage(ProducerTemplate template,
String endpointUri) {
Exchange exchange = template.request(endpointUri, new Processor() {
public void process(final Exchange exchange) throws Exception {
exchange.getIn().setBody("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soap:Body><ns1:getApplication xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
// + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">hello world</arg0>"
+ "</ns1:getApplication></soap:Body></soap:Envelope>");
System.out.println(exchange.getIn().getBody());
}
});
return exchange;
}
}
cela fonctionne correctement, mais je suis ici générer manuellement Enveloppe soap
fichier wsdl est
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://service.application.buzzor.atpl.com" xmlns:ns1="urn:http://model.application.buzzor.atpl.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="http://service.application.buzzor.atpl.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.application.buzzor.atpl.com">
<xsd:element name="getApplication">
<xsd:complexType/>
</xsd:element>
<xsd:element name="getApplicationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="addApplication">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="ns1:Application"/>
<xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="ns1:User"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="addApplicationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="ns1:ApplicationResult"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="urn:http://model.application.buzzor.atpl.com">
<xsd:complexType name="Application">
<xsd:sequence>
<xsd:element minOccurs="0" name="APP_ID" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="APP_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="APP_PASSWORD" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="APP_TYPE" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="APP_VERSION" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="EXCEPTION_HANDLED" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="IS_LOGIN_REQUIRED" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="LONG_CODES" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="PREVIOUS_NODE_KEY" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="REPLY_TEXT" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="WELCOME_NOTE" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="User">
<xsd:sequence>
<xsd:element minOccurs="0" name="ACTIVE_STATUS" type="xsd:int"/>
<xsd:element minOccurs="0" name="CUSTOMER_ID" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="FIRST_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="IS_ADMIN" type="xsd:int"/>
<xsd:element minOccurs="0" name="LAST_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="LOGIN_USER_ID" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="LOGIN_ALLSC" type="xsd:int"/>
<xsd:element minOccurs="0" name="USER_ACTION" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_CONFIRM_PASSWORD" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_ID" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_PASSWORD" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_PATH" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_STATUS" type="xsd:int"/>
<xsd:element minOccurs="0" name="USER_TYPE" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="VERSION_ID" type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ApplicationResult">
<xsd:sequence>
<xsd:element minOccurs="0" name="APP_ID" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="APP_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="ERROR_MESSAGE" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="ERROR_STATUS" nillable="true" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="addApplicationRequest">
<wsdl:part name="parameters" element="tns:addApplication">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addApplicationResponse">
<wsdl:part name="parameters" element="tns:addApplicationResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getApplicationResponse">
<wsdl:part name="parameters" element="tns:getApplicationResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getApplicationRequest">
<wsdl:part name="parameters" element="tns:getApplication">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ApplicationServicePortType">
<wsdl:operation name="getApplication">
<wsdl:input name="getApplicationRequest" message="tns:getApplicationRequest">
</wsdl:input>
<wsdl:output name="getApplicationResponse" message="tns:getApplicationResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="addApplication">
<wsdl:input name="addApplicationRequest" message="tns:addApplicationRequest">
</wsdl:input>
<wsdl:output name="addApplicationResponse" message="tns:addApplicationResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ApplicationServiceHttpBinding" type="tns:ApplicationServicePortType">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getApplication">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getApplicationRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getApplicationResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="addApplication">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="addApplicationRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="addApplicationResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ApplicationService">
<wsdl:port name="ApplicationServiceHttpPort" binding="tns:ApplicationServiceHttpBinding">
<wsdlsoap:address location="http://localhost:8081/buzzor-service/services/ApplicationService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
maintenant, je veux générer une requête soap plutôt que statique
s'il vous plaît aider moi
Merci d'avance
OriginalL'auteur Darshan Patel | 2014-01-02
Vous devez vous connecter pour publier un commentaire.
J'ai Modifié mon code comme suit
maintenant, il fonctionne très bien mais je pense que je ne suis pas à l'aide de chameau correctement
afin de m'aider à améliorer générer une requête soap à l'aide de chameau sans écrire de code java.
OriginalL'auteur Darshan Patel
Si vous étiez à l'aide d'un JAXB entité au lieu d'une Chaîne, vous pouvez utiliser les SAVON de format de données de maréchal dans une enveloppe SOAP. À partir de cette page...
En général, il est déconseillé d'écrire à la main votre XML car il est très enclins à faire des erreurs et vous ne pouvez pas faire usage de ces fonctionnalités à portée de main. Vous trouverez également de la difficulté à utiliser l'un de l'expression des langues autres que XPath face de la plaine de la chaîne.
JAXWS s'appuie sur JAXB annoté classes pour gérer la génération, l'analyse et la navigation et le chameau s'appuie à son tour sur celui-ci pour effectuer le travail, telles que l'évaluation des expressions. Vous constaterez qu'il est beaucoup plus facile et vous pouvez générer des classes à l'aide d'un plugin maven, ou même de l'éclipse (clic droit WSDL > Générer JAXB classes ou similaire). Je ne suis pas familier avec tout moyen de réaliser ce que vous voulez sans elle.
comme vous l'avez dit, j'ai écrit de code suivant, mais se l'exception
package com.atpl.buzzor.applicatiion.service; import javax.jws.WebMethod; import javax.jws.WebService; @WebService( targetNamespace = "http://service.application.buzzor.atpl.com", name = "ApplicationService", serviceName = "ApplicationService", portName = "ApplicationServiceHttpPort" ) public interface ApplicationService { @WebMethod public void getApplication() throws Exception; }
cela signifie que je dois générer stub client et puis je suis en mesure de générer de savon à la demande de ce client? veuillez l'expliquerDésolé, j'ai oublié de mentionner que je suis d'erreur suivant
Exception in thread "main" javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "com.atpl.buzzor.applicatiion.service" doesnt contain ObjectFactory.class or jaxb.index - with linked exception: [javax.xml.bind.JAXBException: "com.atpl.buzzor.applicatiion.service" doesnt contain ObjectFactory.class or jaxb.index]
Lorsque vous générez les classes, qu'il crée un appelé ObjectFactory dans le paquet à côté de votre service et des entités. Jetez un oeil sur les exemples du chameau CXF la documentation [camel.apache.org/cxf.html] et les exemples liés. Ils utilisent maven pour générer des artefacts qui vous utilisez plusieurs plugins à faire, dont la CXF qui est des Chameaux par défaut JAXWS impemenation. [cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html].
OriginalL'auteur James
1) Permettez-moi d'appeler votre fichier wsdl buzzor.wsdl. Enregistrer votre fichier wsdl dans votre Répertoire de projet comme ci-dessous, puis de Générer des classes à partir du fichier wsdl à l'aide de wsdl2java plugin. Dans votre pom.xml ajouter cette.
Vous verrez les classes générées comme ci-dessous..
ApplicationServicePortType_ApplicationServiceHttpPort_Client.java est un exemple de client, que vous pouvez utiliser pour écrire votre client personnalisé si vous le souhaitez.
dans votre cas, laissez-nous utiliser ApplicationServicePortType.java qui définit 2 méthodes
2) dans votre printemps contexte configurer le Jaxws client.
3) dans votre Chameau route, vous pouvez invoquer un haricot...
4) dans votre SoapUtils classe, vous pouvez injecter le applicationService de haricots et d'invoquer le service web
OriginalL'auteur Manjunath