Solucionado (ver solução)
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.