Eu estou começando a aprender a trabalhar com web services
e estou com uma dúvida que não estou conseguindo resolver,
eu estou seguindo o seguinte tutorial para fazer o meu web services utilizando o Axis2:
Porém toda a hora que executo o cliente aparece o Axis Fault e eu não sei porque
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at clienteaxis2.ClienteAxis.main(ClienteAxis.java:34)
Exception in thread "main" AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server
faultSubcode:
faultString: namespace mismatch require http://calc found none
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:namespace mismatch require http://calc found none
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:604)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1759)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2915)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:819)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:392)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at ClienteAxis.main(ClienteAxis.java:34)
{http://xml.apache.org/axis/}hostname:garapa
namespace mismatch require http://calc found none
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:604)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1759)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2915)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:819)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:392)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at ClienteAxis.main(ClienteAxis.java:34)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
Será que vc roger_rf e kdoigor ou alguém poderia me dar uma ajuda?
eu consigo sim abrir o arquivo WSDL no meu browser, porém não sei direito o que é pra que serve esse PORT
eu criei o meu arquivo wsdl (gerado automaticamente) e o meu serviço tudo pelo netbeans.
Mas eu não sei o que está acontecendo, será que você ou alguém poderia me dar uma ajuda?
O meu código está identico ao do tutorial que eu estou seguindo kdoigor
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
public class ClienteAxis {
public static void main(String[] args) throws Exception {
String endpoint = "http://garapa.intermidia.icmc.usp.br:8080/axis2/services/Calc";
Integer op1 = new Integer(100);
Integer op2 = new Integer(200);
Service service = new Service();
Call call = (Call) service.createCall();
// Establecemos la dirección en la que está activado el WebService
call.setTargetEndpointAddress(new java.net.URL(endpoint));
// Establecemos el nombre del método a invocar
call.setOperationName("soma");
// Establecemos los parámetros que necesita el método
// Observe que se deben especidicar correctamente tanto el nómbre como el tipo de datos..
// esta información se puede obtener viendo el WSDL del servicio Web
call.addParameter("in0", XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("in1", XMLType.XSD_INT, ParameterMode.IN);
// Especificamos el tipo de datos que devuelve el método.
call.setReturnType(XMLType.XSD_INT);
// Invocamos el método
Integer result = (Integer) call.invoke(new Object[]{op1, op2});
// Imprimimos los resultados
System.out.println("El resultado de la multiplicación es: " + result);
}
}
Será que teria como vc kdoigor ou alguém me dar uma ajuda?
Não recomendo o uso do gerador de classes para consumo de WebServices do NetBeans, já tive vários problemas com ele. A forma com que trabalho atualmente é gerar os WebServices através de um arquivo BAT no prompt de comando. Segue o arquivo BAT:
[code]@ECHO OFF
ECHO Gerando codigo Java para Webservices…
ECHO.
set JAVA_HOME=C:\Arquivos de programas\Java\jdk1.6.0_26
set AXIS2_HOME=C:\Java\Libs\axis2-1.5.3
set COMANDO_AXIS2=C:\Java\Libs\axis2-1.5.3\bin\wsdl2java.bat
set BINDING_AXIS2=adb
set PKG_DESTINO=br.com.nome_da_sua_empresa
set DIR_DESTINO_FONTES=.\src
set DIR_DESTINO_RECURSOS=.\resources
set OPCOES_AXIS2=-d %BINDING_AXIS2% -p %PKG_DESTINO% -S %DIR_DESTINO_FONTES% -R %DIR_DESTINO_RECURSOS%
na verdade se tem q chamar sua classe webService e não a service generic .
se deveria ter algo como :
String targetNS = "<sua url do serviço - namespace>";
QName serviceName = new QName(targetNS, "<nome do serviço que ta no wsdl>");
QName portName = new QName(targetNS, "<nome do port que ta no wsdl>");
URL endpointAddress = new URL(<url do weu wsdl>);
Service service = Service.create(this.serviceName);
service.addPort(this.portName, SOAPBinding.SOAP11HTTP_BINDING,endpointAddress.toExternalForm());
Dispatch<Source> dispatch = service.createDispatch(this.portName, Source.class, Mode.PAYLOAD);
Source resposta = dispatch.invoke(<aqui vai seus parametros>);
cara, gerar pelo netbeans funfa sim, o lance é que no axis vc tem mais chances de erros que usar a implementação de referencia.
faz com o metro que vai ser bem mais facil.
Não entendo tanto de Linux, mas acho que não deve ser muito complicado converter este arquivo BAT para uma sintaxe válida no Ubuntu. Façamos as seguintes suposições:
O arquivo executável do Java está em /usr/bin/java, e pode ser disparado através do comando “java” no Bash;
Sua distribuição do Axis 2 está na pasta /home/ricardo/axis2-1.5.3;
Você criou uma pasta chamada /home/ricardo/arquivos_wsdl, onde gravou as cópias dos arquivos WSDL cujos WebServices quer consumir.
Na pasta /home/ricardo/arquivos_wsdl, use o comando a seguir:
“br.com.nome_da_sua_empresa” é o nome do package sob o qual o código para consumo dos WebServices será gerado, e “Nome_do_WebService.wsdl” é o nome do arquivo WSDL com a definição dos WebServices. Se você tiver vários arquivos WSDL, será necessário executar o comando para cada um deles separadamente. Ao fim do processo, a pasta /home/ricardo/arquivos_wsdl/src conterá código Java que você poderá usar para consumir os WebServices.
A propósito, evite incluir comentários repetitivos no seu post. Isso não vai fazer com que mais pessoas se interessem em tentar resolver o seu problema; na verdade, o efeito vai ser exatamente o contrário.
em casa eu monto um exemplo e te passo… não faço isso agora por que agora não da.
faz um certo tempo que não trabalho com axis 2 mas lembro que o código ficava diferente… basicamente eu tinha um stub (que o eclipse gerava para mim usando o axis 2, acredito que o netbeans faça o mesmo), instanciava a classe principal do stub passando o endereço do wsdl no construtor, chamava os setters no stub e depois o método do serviço, recebendo um outro objeto como retorno…
se der em casa eu vejo isso ou amanhã no mais tardar…