Caused by: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.Integer for parameter codigo with expected type of class java.lang.String from query string

2 respostas
java
beatriz.v

Pessoal, boa noite.

Vejam se conseguem me ajudar, pois estou tentando várias alterações sem sucesso…

Ao realizar a minha pesquisa, está aparecendo o seguinte erro:
Caused by: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.Integer for parameter codigo with expected type of class java.lang.String from query string

Vlw de qualquer forma.

Segue abaixo os códigos:

index.xhtml

<h:body>

        <f:view>

            <h:form>
                <p:growl autoUpdate="true" showDetail="true" showSummary="true"/>
                <h:form id="pesquisaForm">
                    <p:panel header="Pesquisa Cliente" style="width:600px">

                        <br></br>
                        <h:panelGrid columns="2">
                            <h:outputLabel value="Código Cliente:" for="codigo"/>
                            <p:inputText id="codigo" value="#{clienteController.codigo}" size="8" required="true"/>
                        </h:panelGrid>
                        <br></br>

                        <p:commandButton value="Consultar" action="#{clienteController.pesquisar()}" update=":msgs lista" ajax="false"/>

                    </p:panel>
                </h:form>
            </h:form>
        </f:view>
    </h:body>
</html>

classe cliente

@Entity
@Table(name = "CLI")
public class Cliente implements Serializable {

    @Id
    @Column(name = "CDCLI")
    String codigo;

    @Column(name = "RASCL")
    private String razaoSocial1;

 
    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getRazaoSocial1() {
        return razaoSocial1;
    }

    public void setRazaoSocial1(String razaoSocial1) {
        this.razaoSocial1 = razaoSocial1;
    }

 
    public String getRazaoSocial() {
        return razaoSocial1.trim() + razaoSocial2.trim();
    }

    public String getRazaoCodigo() {
        return getRazaoSocial() + " " + codigo;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.codigo != null ? this.codigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Cliente other = (Cliente) obj;
        if ((this.codigo == null) ? (other.codigo != null) : !this.codigo.equals(other.codigo)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return codigo;
    }
}

clienteFacade

@Stateless
public class ClienteFacade {

        protected EntityManager getEntityManager() {
        return em;
    }

    public void edit(Cliente c) {
        getEntityManager().merge(c);
    }

    public List<Cliente> findAll() {
        return getEntityManager()
                .createQuery("SELECT c FROM Cliente c", Cliente.class
                )
                .getResultList();
    }

    public List<Cliente> findByNome(String codigo) {
        Query q = getEntityManager().createQuery("SELECT c FROM Cliente c WHERE c.codigo = :codigo", Cliente.class);
        q.setParameter("codigo", Integer.parseInt(codigo));
        return q.getResultList();
    }
}

2 Respostas

victoralcantara

Olá, o problema pode estar na conversao do tipo String para Integer no seu método findByNome().
O ideal seria colocar Integer ou Long no tipo da variavel codigo (alterando tambem os gets e sets para Integer) e alterar o tipo do parametro para Integer ou Long em findByNome(Integer codigo).

Da forma como voce fez pode dar erro no parse na hora de converter “casa” para um Integer.

raphaeloneves

Vejo que não está acessando uma instância de cliente no seu controller. Tem como postar a classe ClienteController, por favor?

Sem analisar esta classe controladora, eu iria na mesma linha de raciocínio do @victoralcantara. O seu input é do tipo texto, o que permite a entrada de caracteres alfanuméricos. Isso abre uma grande brecha pra ter problema na hora do parse, pois digamos que seu o usuário entre com “4564q” . Vai dar ruim na hora de converter a string pra int. Outra coisa que é bacana saber, o JSF tem um conversor nativo de string para inteiros, o que minimizaria o estrago, pois se houvesse erro de conversão de atributos, a exception seria lançada antes de entrar na camada de serviço, facilitando absurdamente o debug e correção.

Por exemplo, se seu atributo código for do tipo Long, não importa se vc amarrou ou não o tipo de dado no seu input, pois nativamente o JSF fará essa conversão pra vc, garantindo meio que um “type safe” do campo.

Algum motivo especial para acessar o código direto no controller e não por uma instância de cliente no controller? Algo do tipo:

#{clienteController.cliente.codigo}

Criado 20 de dezembro de 2016
Ultima resposta 23 de dez. de 2016
Respostas 2
Participantes 3