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
B

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

V

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.

R

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