Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
18
respostas

Erro HTTP Status 400 - Required int parameter 'id' is not present

com base base nas aulas estou criando um trecho de código que vai pegar o valor selecionado das minhas combos dependentes , e o email do usuario logado, e guardar no banco ou em um array, eu consigo passar para controller o valor e retornar numa model and view, e consigo visualizar pelo devtools do firefox, o problema que quando finaliza o metodo ele da esse erro que não tem esse parametro e muda minha uri, sendo que ele esta sendo impresso no devtools e no proprio console, podem dar alguma dica?

meu metodo js

$("#botao").on("click", function() {
        console.log("ok");

        var email = $("#email").val();
        var id = $("#CmbDepartamento").val();

        $.ajax({
            type : 'get',
            url : '/Preconizado/departamento/gravarAreas',
            dataType : 'JSON',
            data : ({
                id : id,
                email : email
            }),

            success : function(data) {
                console.log("sucesso");
                console.log(data);

            },
            error : function(data) {
                console.log("erro na funçao");
            }

        });

    });
}

e minha controller

@RequestMapping(value = "/gravarAreas", method = RequestMethod.GET)
    public @ResponseBody ModelAndView gravarAreas(@RequestParam int id, Usuario usuario) {
        // ModelAndView modelAndView = new ModelAndView("/departamento/lista");

       ModelAndView modelAndView = new ModelAndView("/departamento/lista");
        String teste = usuario.getEmail();

        int recebeId = id;
        System.out.println(teste + " - " + recebeId);
        return modelAndView;

    }

minha uri antes do metodo

http://localhost:8080/Preconizado/departamento/lista

e depois

http://localhost:8080/Preconizado/departamento/lista

minha view chamando metodo da controller

<form:form action="${ s:mvcUrl('DC#gravarAreas').build() }"
        method="get">
        <div class="modal-footer">
            <button type="submit" id="botao" class="btn btn-primary">Enviar</button>
        </div>
    </form:form>
18 respostas

fiz um teste mudando os metodos para post e da outro erro e minha uri fica assim

http://localhost:8080/Preconizado/departamento/gravarAreas?id

e no dev tools fica assim quando vou debugando e fica assim

POST http://localhost:8080/Preconizado/departamento/gravarAreas    
405 Method Not Allowed

e no fim a uri fica assim

http://localhost:8080/Preconizado/departamento/gravarAreas?id

e o erro da HTTP Status 400 -

mas no console não aparece nenhum erro

Olá, Diego.

Batendo o olho no código eu não achei nenhum erro. Está aparecendo algum no Java? Se sim, cola o erro aqui?

Ah! Manda o código da sua class Usuario?

no java não da erro nenhum Marco,

classe usuario

package br.com.preconizado.models;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Entity
public class Usuario implements UserDetails {

    private static final long serialVersionUID = 1L;
    @Id
    private String email;
    private String nome;
    private String senha;
//    private boolean islogado = false;

    @OneToMany(fetch = FetchType.EAGER)
    private List<Role> roles = new ArrayList<Role>();

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

//    public boolean getIslogado() {
//        return islogado;
//    }
//
//    public void setIslogado(boolean islogado) {
//        this.islogado = islogado;
//    }

    @Override
    public String toString() {
        return "Usuario [email=" + email + ", nome=" + nome + ", senha=" + senha + ", roles="
                + roles + "]";
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        return this.roles;
    }

    @Override
    public String getPassword() {

        return this.senha;
    }

    @Override
    public String getUsername() {
        return this.email;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

Oi Diego, vc está enviando os dados usando JSON e está tentando receber no controller como um @RequestParam. O ideal é vc criar uma classe, que tenha o id e o usuário como atributos, receber um objeto desse novo tipo como argumento, e anotar o parâmetro como @RequestBody.

Alberto fiz da maneira como disse, esta dando um novo erro 415 Unsupported Media Type ...

@RequestMapping(value = "/gravarAreas", method = RequestMethod.POST)
    public @ResponseBody ModelAndView gravarAreas(@RequestBody  AreasAdmin areasAdmin) {
        // ModelAndView modelAndView = new ModelAndView("/departamento/lista");

        ModelAndView modelAndView = new ModelAndView("/departamento/lista");
        System.out.println(areasAdmin.getUsuarios().getEmail());
        System.out.println(areasAdmin.getNomeArea());
        areasAdmin.setId(id);
        System.out.println(areasAdmin.getId());

        return modelAndView;

    }

a classe do objeto

@Component
public class AreasAdmin {

    private Usuario usuarios;
    private int id;
    private String nomeArea;

    public Usuario getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(Usuario usuarios) {
        this.usuarios = usuarios;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNomeArea() {
        return nomeArea;
    }

    public void setNomeArea(String nomeArea) {
        this.nomeArea = nomeArea;
    }

    @Override
    public String toString() {
        return "AreasAdmin [usuarios=" + usuarios + ", id=" + id + ", nomeArea=" + nomeArea + "]";
    }

}

ele sequer entra no metodo da controler

Experimenta colocar o seguinte em cima do controller:

@RequestMapping(value = "/gravarAreas", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)

Esse classe MediaType é do pacote do Spring. Você precisa ensinar ao framework que ele vai consumir os parâmetros no formato JSON :). Acho que vai funcionar, ou pelo menos mudar o erro.

Alberto coloquei, mas não teve nenhuma mudança o erro continua o mesmo, e no console também não apareceu nada.

Hmm, fui surpreendido :P. Abre o dev tools do seu navegador, tipo o chrome tools ou firebug e verifica se o content-type do envio está sendo application/json.. eu chuto que não. Se for isso, o erro está no jquery e não no Spring MVC. Talvez naquele datatype ali.

esta assim o cabeçalho de solicitação

Accept    
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding    
gzip, deflate
Accept-Language    
pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Connection    
keep-alive
Cookie    
JSESSIONID=072CC18A161FA2AA04C659D021A1C8DB
Host    
localhost:8080
Referer    
http://localhost:8080/Preconizado/departamento/lista
User-Agent    
Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0

e o de resposta

Cache-Control    
no-cache, no-store, max-age=0, must-revalidate
Content-Language    
en
Content-Length    
1048
Content-Type    
text/html;charset=utf-8
Date    
Tue, 09 Aug 2016 16:35:52 GMT
Expires    
0
Pragma    
no-cache
Server    
Apache-Coyote/1.1
X-Frame-Options    
DENY
X-XSS-Protection    
1; mode=block
x-content-type-options    
nosniff

fiz alguns testes aqui e retirei a anotação @RequestBody , e o consumes = MediaType.APPLICATION_JSON_VALUE do metodo ai funcionou, entrou nele retornando um json, mas o problema que ela não pega o valor que passei pelo ajax e fica assim

{"usuarios":null,"id":0,"nomeArea":null}

ficou assim

@RequestMapping(value = "/gravarAreas", method = RequestMethod.GET)
    public @ResponseBody AreasAdmin gravarAreas(AreasAdmin admin) {

        System.out.println(admin);
        return admin;

    }

o ajax

$.ajax({
            type : 'GET',
            url : '/Preconizado/departamento/gravarAreas',
            contentType : "application/json",
            dataType : 'json',
            data : {
                // teste : teste,
                id : id,
                //email : email
            // nome : nome
            },

            success : function(data) {
                console.log("sucesso");
                console.log(email);

            },
            error : function(data) {
                console.log("erro na funçao");
            }

        });

    });
});

Opa, vc mostrou o cabeçalho da requisição para a página de listagem e não do ajax. Só que agora vc adicionou uma propriedade contentType no ajax do jquery.. Volta com o RequestBody e com o consumes.

coloquei do jeito que estava

@RequestMapping(value = "/gravarAreas", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody AreasAdmin gravarAreas(@RequestBody AreasAdmin admin) {

        System.out.println(admin);
        return admin;

    }

ajax 

$(document).ready(function() {
    $("#botao").on("click", function() {
        console.log("ok");

        var email = $("#email").val();
        var teste = "ola";
        var id = $("#CmbDepartamento").val();
        var nome = $('#CmbDepartamento');

        $.ajax({

            url : '/Preconizado/departamento/gravarAreas',
            type : 'GET',
            dataType : 'json',
            data : {

                id : id,
                email : email

            },

            success : function(data) {
                console.log("sucesso");
                console.log(email);

            },
            error : function(data) {
                console.log("erro na funçao");
            }

        });

    });
});

e olhando pelo firebug na aba Rede e selecionando o xhr após fazer a requisição não aparece nada, e se clico na sub aba All aparece esses cabeçalhos: resposta

Cache-Control    
no-cache, no-store, max-age=0, must-revalidate
Content-Language    
en
Content-Length    
1048
Content-Type    
text/html;charset=utf-8
Date    
Tue, 09 Aug 2016 20:30:18 GMT
Expires    
0
Pragma    
no-cache
Server    
Apache-Coyote/1.1
X-Frame-Options    
DENY
X-XSS-Protection    
1; mode=block
x-content-type-options    
nosniff

solicitação:

Accept    
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding    
gzip, deflate
Accept-Language    
pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Connection    
keep-alive
Cookie    
JSESSIONID=A934C8608A766BE22FD9C5DA1104418E
Host    
localhost:8080
Referer    
http://localhost:8080/Preconizado/departamento/lista
User-Agent    
Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0

No exemplo acima, vc tinha adicionado essa propriedade aqui: contentType : "application/json",. Adiciona de novo? E é bem estranho que não esteja aparecendo nada na aba network, o que vc mostrou, continua sendo da listagem :/.

Alberto bom dia! eu adicionei de novo o contentType : "application/json" mas pelo visto não mudou nada, outra coisa que notei olhando outro metodo que tambem envia um json aqui é que na aba network ele envia no cabeçalho de solicitação esse endereço:

Referer    
http://localhost:8080/Preconizado/departamento/lista

fui debugando de novo o js, e ele me da um primeiro erro

400 Bad Request

e depois da esse

415 Unsupported Media Type

e na aba network olhando pelo xhr não mostra nenhuma solicitação, so as do html que ja enviei.

Cara, a única coisa que eu percebo é que vc não deveria fazer um get e sim um post, já que vc quer criar algo novo no servidor e ainda está enviando um JSON. Na verdade, eu já devia ter percebido isso antes, pq durante toda thread esse GET ta ali... E no controller, você coloca post também

coloquei tudo como post e estou debugando: nos cabeçalhos estãlo assim:

General
Request URL:http://localhost:8080/Preconizado/departamento/gravarAreas

Request Headers
Provisional headers are shown
Accept:application/json, text/javascript, */*; q=0.01
Content-Type:application/json
Origin:http://localhost:8080
Referer:http://localhost:8080/Preconizado/departamento/lista
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
X-Requested-With:XMLHttpRequest

Request Payload
email=diego_domingo1%40hotmail.com&id=1&nomeArea=ola

nesse momento da esse erro primeiro

POST http://localhost:8080/Preconizado/departamento/gravarAreas 405 (Method Not Allowed)

que cai nesse trecho

error : function(data) {
                alert(data);
                console.log("erro na funçao");
            }

e os cabeçalhos estão assim quando da o erro 415

geral
Request URL:http://localhost:8080/Preconizado/departamento/gravarAreas
Request Method:POST
Status Code:415 Unsupported Media Type
Remote Address:[::1]:8080

Response Headers
solicitação
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Language:en
Content-Length:1048
Content-Type:text/html;charset=utf-8
Date:Wed, 10 Aug 2016 16:15:23 GMT
Expires:0
Pragma:no-cache
Server:Apache-Coyote/1.1
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block

Request Headers
view source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:42
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=910E22A41F2614D1FFD354539615E567
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/Preconizado/departamento/lista
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
solução!

Obrigado pela ajuda consegui fazer aqui, com os parâmetros separados em vez de objeto, por enquanto já vai servir.