Duvida WebService com ArrayList

11 respostas
D

Olá pessoal tudo bem?
Estou com um problema.
Estou desenvolvendo um WebService para uma aplicação aqui na empresa que é mais ou menos assim…

Eu tenho que receber o xml a seguir:

<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>

    <Login xmlns="http://tempuri.org/">

      <user>0056</user>

      <password/>

      <configInfo>

        <configuration>

          <appSettings>

            <add key="UnidadeNegocio" value="1"/>

            <add key="CodigoFilial" value="1"/>

            <add key="CodigoTerminal" value="001"/>

            <add key="OperacaoVenda" value="01"/>

            <add key="TabelaPreco" value="01"/>

            <add key="EnviaZip" value="False"/>

            <add key="Orcamento" value="True"/>

            <add key="ServerAddress" value="http://192.168.121.37:8731/LinxPOS.DataServer/DataProvider/"/>

          </appSettings>

        </configuration>

      </configInfo>

    </Login>

  </soap:Body>

</soap:Envelope>

---------

---------

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

  <s:Body>

    <LoginResponse xmlns="http://tempuri.org/">

      <validLogin>true</validLogin>

    </LoginResponse>

  </s:Body>

</s:Envelope>

Para que eu pudesse receber o configInfo tentei criar um arrayList que armazenasse todos os parametros, porém se utilizo arrayList, quando vou gerar o WebService ele apresenta um erro dizendo que não é permitido.

Para isso, criei um bean e coloquei na chamada do método

public void login( String user, String password, ConfigurationInfo[] configList, boolean validLogin ) throws Exception{

O meu no caso receberia os valores de todos os parametros do ConfigInfo, porém quando aciono o método, apresenta o seguinte erro

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <soapenv:Body>

    <soapenv:Fault>

      <faultcode>soapenv:Server.generalException</faultcode>

      <faultstring>Tried to invoke method public void webservice.NotaFiscalTeste.login(java.lang.String,java.lang.String,bean.ConfigurationInfo[],boolean) throws java.lang.Exception with arguments java.lang.String,java.lang.String,[Lbean.ConfigurationInfo;,null.  The arguments do not match the signature.; nested exception is: 

      java.lang.IllegalArgumentException</faultstring>

      <detail>

        <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">ictsrv-tomcat</ns1:hostname>

      </detail>

    </soapenv:Fault>

  </soapenv:Body>

</soapenv:Envelope>

Alguém saberia me dizer como devo proceder?

Obrigada!

11 Respostas

M

dsystem, você não postou o trecho de código que faz a chamada, mas, pelo erro, acredito que você está passando parâmetros inválidos.

O segundo parâmetro do método é um array de bean.ConfigurationInfo, mas parece estar sendo chamado com um array de String.

O terceiro parâmetro é um boolean (primitivo) e está sendo chamado com null (o boolean primitivo aceita apenas false/true).

Cheque esses parâmetros e veja se resolve o problema. Se não resolver, posta o trecho de código que faz a chamada do webservice.

D

mtakeda, em primeiro lugar, obrigada pela atenção.
Então, eu já fiz um teste com o terceiro parâmetro, passando ele como false, mas o erro persiste. Pelo que vejo o erro está mesmo no ArrayList. Na verdade eu estou um pouco perdida nessa parte de WebService.

Infelizmente eu não tenho acesso ao código que faz a chamada do webService, porque é mais ou menos assim:
Aqui na empresa tem a equipe de .Net e a equipe de Java. Eu estou na parte de Java(como deu para perceber) e estou encarregada em fazer o WebService. O método que faz a chamada é feito em C# e eu não tenho acesso a essa fonte. Mais uma dificuldade que eu tenho.

Você saberia me dizer como passar um ArrayList como parâmetro no método? Acho que é isso que está dando problema =/

Obrigada

Bjs!

M

dsystem, então, você está desenvolvendo um webservice e não consumindo ele, certo?

Esse erro que você colocou não é na hora de chamar o webservice?

Eu não acho que o problema está no ArrayList porque você disse que tentou com Array e também não funcionou.

Você não quer postar o método login inteiro aí e também me dizer em que parte do código você obtém esse erro?

D

Oi mtakeda, segue o código do método login

public void login( String user, String password, ConfigurationInfo[] configList, boolean validLogin ) throws Exception{

            

            validLogin = false;

            Connection con = null;

            CallableStatement cs = null;

            try{

                  Context context = new InitialContext();

                  DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/OracleDSYA");

                  

                  con = ds.getConnection();

                  cs = con.prepareCall("{ call PCKG_WS_COL_VENDAS.PRCD_LOGIN(?,?,?) }");

                  cs.setString( 1, user.toUpperCase().trim() );

                  cs.setString( 2, password.toUpperCase().trim() );

                  cs.registerOutParameter( 3, Types.INTEGER );

                  

                  cs.execute();

                  if( cs.getInt( 3 ) == 1 ){

                        validLogin = true;      

                  }

            } catch (SQLException e) {

                  e.printStackTrace();

            } catch (NamingException e) {

                  e.printStackTrace();

            } catch (Exception e) {

                  e.printStackTrace();

            } finally {

                  if (cs != null) {

                        try {

                             cs.close();

                        } catch (SQLException e) {

                             e.printStackTrace();

                        }

                  }

                  if (con != null) {

                        try {

                             con.close();

                        } catch (SQLException e) {

                             e.printStackTrace();

                        }

                  }

            }

      }

Mais uma vez obrigada!

M

dsystem, não é a sua função login que está dando aquele erro. Você consegue postar o código que dá aquele erro?

De qualquer forma, sua função possui algumas problemas. Em primeiro lugar, eu imagino que o validLogin não deva ser um parâmetro, mas sim um retorno. Então a assinatura da sua função deveria ser

public boolean login( String user, String password, ConfigurationInfo[] configList)

E ela deve retornar true ou false, dependendo do resultado.

Em segundo lugar, a variável configList não está sendo utilizada em lugar nenhum, então, eu não consegui entender pra que ela serve.

D

Mtakeda, concordo que o mais correto seria o método retornar um boolean, porém esta como parâmetro, para adequar-se a aplicação externa já existente (que vai chamar esse método login).

O configList, até então realmente não esta sendo utilizado, vai ser após eu conseguir receber ele, pois nele vai conter dados como filial, terminal, etc, dados que serão tratados e passados para a rotina que validará o usuário.

Recebo os parâmetros da seguinte maneira:

<user>0056</user>

      <password/>

      <configInfo>

        <configuration>

          <appSettings>

            <add key="UnidadeNegocio" value="1"/>

            <add key="CodigoFilial" value="1"/>

            <add key="CodigoTerminal" value="001"/>

            <add key="OperacaoVenda" value="01"/>

            <add key="TabelaPreco" value="01"/>

            <add key="EnviaZip" value="False"/>

        <configuration>

      <configInfo>

No estagio atual do projeto o que preciso é somente descobrir como pegar esses dados passados dentro do configInfo.

E o erro acontece logo na chamada do método, ele nem chega a entrar no método. (antes de incluir o configList) funcionava corretamente.

Depois disso já tomei alguns tipos de exception: por exemplo:

?Tried to invoke method public void webservice.NotaFiscalTeste.login(java.lang.String,java.lang.String,bean.ConfigurationInfo[],boolean) throws java.lang.Exception with arguments java.lang.String,java.lang.String,[Lbean.ConfigurationInfo;,null. The arguments do not match the signature.; nested exception is:

java.lang.IllegalArgumentException?

e:

?org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize?

M

dsystem, ele não entra no método porque você mudou a assinatura. Então, você tem que mudar a chamada também. Se antes de incluir, funcionava, é porque o método está sendo chamada sem o config. O problema não está no seu método, e sim no local que chama esse método.

Com relação ao retorno ser booolean, acontece que do jeito que está sendo passado, a aplicação que chama não vai conseguir ver se o login foi válido ou não, porque o Java passa os parâmetros por valor, e não por referência. Isso significa que a alteração no validLogin feita dentro do seu método não será enxergada fora dele.

D

Então,

A assinatura do método foi alterada exatamente porque a chamada foi alterada, pela necessidade da aplicação passar o config.

=/

Mas duas perguntas:
1- Você aconselharia algum material bom para essa parte de WebService?Cursou ou algo do tipo? Porque todo material que encontrei, de certa forma, só enchiam lingüiça e não ajudaram em nada.
2 - Você teria algum exemplo de ArrayList passando como parametro na chamada do método em WS?

Mais uma vez, obrigada!!!

M

dsystem, eu não tenho nenhum exemplo agora.

Mas você pode encontrar exemplos e material aqui mesmo no fórum. Procure por web services e axis, por exemplo

E
ACHO QUE ISSO PODE AJUDAR
//MEU WS
 @WebMethod(operationName = "Login")
    public String Login(@WebParam(name = "usuario") String usuario, @WebParam(name = "senha") String senha)
            throws Exception {

        String rt = "false";
        UsuarioDao uDao = new UsuarioDao();
        List<Usuario> usuarios = new ArrayList<Usuario>();
        usuarios.addAll(uDao.listar());
        for (Usuario u : usuarios) {
            if (u.getUserName().equals(usuario) && u.getPassword().equals(senha)) {
                System.out.println("userName: " + u.getUserName() + "  senha:" + u.getPassword());
                rt = "true";
                break;
            }
        }
        //HibernateUtil.getSession().close();
        System.out.println("returno WS " + rt);
        System.out.println("valor de parametros " + usuario + senha);

        return rt;
    }
aqui meu usuarioDao
package edu.web.dao;

/**
 *
 * @author Elton Sandré
 */
import edu.web.beans.Usuario;
import java.util.ArrayList;
import java.util.List;

public class UsuarioDao extends Dao<Usuario> {

    public UsuarioDao() {
        super(Usuario.class);
    }

    public boolean validarlogin(String user, String pass) throws Exception {
        boolean rt = false;
       // HibernateUtil.getSession().beginTransaction();
        List<Usuario> usuario = new ArrayList<Usuario>();
        usuario.addAll(listar());
        for (Usuario u : usuario) {
            if (u.getUserName().equals(user) && u.getPassword().equals(pass)) {
                System.out.println("userName: " + u.getUserName() + " - senha: " + u.getPassword());
                rt = true;
                break;
            }
        }
        //HibernateUtil.getSession().close();
        return rt;
    }
}

//aqui me Dao
package edu.web.dao;

import edu.web.uteis.HibernateUtil;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;

@SuppressWarnings("unchecked")
public abstract class Dao<T> {
private Class clazz;

    public Dao(Class c) {
        this.clazz = c;
    }

 public List<T> listar() throws Exception {
        Session session = HibernateUtil.getSession();
        session.beginTransaction().begin();
        try {
            Criteria criteria = session.createCriteria(clazz);
            return criteria.list();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
        return null;
    }
}

 PARA RESPONDER ...MEIO ATRAZADO MAS ...RSRSRS :roll: :roll: :arrow:
E
no caso de ArrayList funciona assim

@WebMethod(operationName = "listaDeAluno")
    public java.util.ArrayList<Aluno> listaDeAluno(@WebParam(name = "listaDeAluno") List listaDeAluno) throws Exception {
        //HibernateUtil.getSession().beginTransaction();
        AlunoDao aDao = new AlunoDao();
        ArrayList<Aluno> aluno = new ArrayList<Aluno>();
        aluno.addAll(aDao.listar());
        for (Aluno a : aluno) {
            System.out.println("Nome: " + a.getNome() + "  Escola:" + a.getEscola());
        }
        return aluno;
    }
Criado 26 de julho de 2010
Ultima resposta 21 de nov. de 2010
Respostas 11
Participantes 3