Erro ao acessar webservice C# com meu cliente java

11 respostas
D

Erro ao acessar webservice C# com meu cliente java

Desenvolvi um cliente de Webservice C# em java, porem quando tento acessar uma operação que tem como parâmetro uma string, me retorna este erro:
"O servidor não pôde processar a solicitação. —> Referência de objeto não definida para uma instância de um objeto."
No entando para qualquer outro tipo de parâmetro (int, float) não ocorrem erros. Se alguem puder me ajudar, por favor.
Abaixo segue meu código:

// Endereço onde encontra-se o Web Service
        String local = "meuEndereco/WebService1.asmx";
        //nome da operação/método que sera acessada
        String nmMetodo = "InserirClientes";
        // Criando e configurando o serviço
        Call call = (Call) new Service().createCall();
        // Configurando o endereço.
        call.setTargetEndpointAddress(local);
        // Marcando o método a ser chamado.
        call.setOperationName(new QName("http://tempuri.org/", nmMetodo));
        //setando o cabeçalho SOAPAction
        call.setSOAPActionURI("http://tempuri.org/"+nmMetodo);
        // Parâmetros da função
        String a = "valor do parametro";
        Object[] param = new Object[]{a};
        // Retorno da Função
        Object ret = call.invoke(param);
        // Imprime o resultado
        out.println("Resultado: " + ret);

Desde já agradeço.

11 Respostas

P

Estranaho heim pois é um tipo primitivo não deveria ter problemas, o que esta usando para desenvolver esse cleint?

D

Estou usando Netbeans e a API Axis 1.4.
O xml SOAP é este aqui:

POST /Cadastros/WebService1.asmx HTTP/1.1
Host: 192.168.10.240
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/InserirClientes"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <InserirClientes xmlns="http://tempuri.org/">
      <DadosEmXml>string</DadosEmXml>
    </InserirClientes>
  </soap:Body>
</soap:Envelope>
J

diego.mauro,

Você chegou a declarar seus objetos do webservice em server-config.wsdd ?

Em algumas situações precisamos declarar a estrutura de objetos neste arquivo. Ou pelo menos declarar a existência deles.
Geralmente isso é feito quando precisamos mandar um objeto do C para o Axis, pois o Axis precisa conhecer este objeto para serializar/ deserializar.

D

Onde encontro este arquivo?

J

Opa,

Fica junto com seu web.xml.

Dá uma olhada nesses links…

http://www.omii.ac.uk/docs/2.3.0/reference/apache_axis/wsdd/wsdd.htm

http://ws.apache.org/axis/java/reference.html

D

O erro ainda perciste, alguem tem mais alguma idéia que possa me ajudar.
Por favor.

P

Tente implementar o mesmo metodo usando Xfire ao inves do AXIS, bem mais simples o Client 3 linhas:

Ex: Client com Xfire que obtem uma String:

public String metodoWS(String par1, String par2, int par3) throws Exception {  
    URL url = new URL(getUrlWS());  
    Object[] resultado = cliente.invoke("metodoWS",new Object[] { par1, par2, par3 });  
    return resultado[0].toString();  
}

Nesse tutorial tem as dependencias do Xfire:

P

Pelo proprio netbeans tem um drag-drop para consumir um ws, mas gera um codigo bem tosco, onde vc cria um novo WS cria uma classe qualquer e arrasta as propriedades do codigo para teste é mais rapido, pois o problema pode estar do no ws construido no .net.

D

Você tem um exemplo completo.
Obrigado.

D

Com o xfire funcionou

segue o código com a solução

import java.net.URL;
import org.codehaus.xfire.client.Client;

public class XFireTeste {
    public static void main(String []args) throws Exception{
       Client client = new Client(new URL("meuEndereco/WebService.asmx?wsdl"));
       // Parâmetros da função
       String teste =  "parametro";
       Object[] b = {teste};
       Object a[] = client.invoke("InserirClientes", b);
       System.out.println(a[0]);
    }
}

Obrigado a todos.

L

Bom amigos estou tb tentando fazer um cliente java chamar um WEB SERVICE C# que autentica Tokens do tipo USERNAMETOKEN, vcs sabem como posso fazer este cliente? tentei o código abaixo mas estou obtendo erro no eclipse na linha em negrito.

import java.net.URL;

import javax.xml.namespace.QName;

//import javax.xml.rpc.Call;

//import javax.xml.rpc.Service;

import javax.xml.rpc.ServiceException;

import javax.xml.rpc.ServiceFactory;

import javax.xml.rpc.handler.*;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.client.Stub;

import org.apache.ws.security.WSConstants;

import org.apache.ws.security.handler.WSHandlerConstants;

import org.apache.ws.security.message.token.UsernameToken;

import java.util.*;

public class ClientSEI {

public static void main(String[] args) throws Exception

{

try {
	
	String UrlString = "http://autserver/WSPA/Service.asmx?WSDL";
    String nameSpaceUri = "http://tempuri.org/";
    String serviceName = "Service";
    String portName = "ServiceSoap";
    String xml = "<?xml version='1.0'?><XSPA><Operador>195</Operador><Acao>22</Acao></XSPA>";

    QName QNserviceName = new QName(nameSpaceUri, serviceName);
    QName  QNportName = new QName(nameSpaceUri, portName); 
    
    URL wsdlLocation = new URL(UrlString);

    // Service
    ServiceFactory factory = ServiceFactory.newInstance();
    Service service;

service = factory.createService(wsdlLocation,QNserviceName);

HandlerRegistry hr = service.getHandlerRegistry();

    List handlerChain = hr.getHandlerChain(QNportName);

    HandlerInfo hi = new HandlerInfo();
    hi.setHandlerClass(SimpleHandler.class);
    handlerChain.add(hi);
	
    // Service Endpoint Interface class generated by WSDL2Java					
    RcxReadLS objRcx = (RcxReadLS) service.getPort(QNportName, RcxReadLS.class);

   	Stub axisPort = (Stub)objRcx;
    axisPort._setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    axisPort._setProperty(UsernameToken.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT);
    axisPort._setProperty(WSHandlerConstants.USER, "useradmin");
    axisPort._setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, "ClienteCallback");
    
    String val = objRcx.processarTransacaoSPA(xml);

 
    // System.out.println("Rcx web service message: " + val);

}
catch (ServiceException ex) {
  ex.printStackTrace();
}

}
}

No Eclipse ocorrer um erro nesta linha em negrito ao tentar factory.createService(wsdlLocation,QNserviceName); . O erro é o seguinte:

Exception in thread “main” java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory

at org.apache.axis.components.logger.LogFactory.class$(LogFactory.java:45)

at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)

at org.apache.axis.components.logger.LogFactory.(LogFactory.java:33)

at org.apache.axis.handlers.BasicHandler.(BasicHandler.java:43)

at org.apache.axis.client.Service.getAxisClient(Service.java:104)

at org.apache.axis.client.Service.(Service.java:113)

at ClientSEI.main(ClientSEI.java:36)

ME AJUDEM POR FAVOR.

Criado 23 de março de 2009
Ultima resposta 25 de mar. de 2009
Respostas 11
Participantes 4