5
respostas

Falha ao executar metodo POST

Oi, por favor, você precisou criar o CursoRepository para carregar o curso do banco de dados. No meu desenvolvimento, não preciso carregar nada do banco de dados. Criei da seguinte forma o metodo POST:

@PostMapping public ResponseEntity cadastrar(@RequestBody LivroForm form, UriComponentsBuilder uriBuilder) { Livro livro = form.converter(); livroRepository.save(livro);

    URI uri = uriBuilder.path("/livros/{id}").buildAndExpand(livro.getId()).toUri();
    return ResponseEntity.created(uri).body(new LivroDto(livro));

}

E, criei o LivroForm com titulo, autor e os metodos get e set. Porem, ao tentar executar no Postman, recebo o seguinte erro:

"timestamp": "2020-09-02T02:00:20.020+00:00", "status": 400, "error": "Bad Request", "trace": [...] "message": "JSON parse error: Cannot construct instance of com.jacqueline.livros.entidades.Autor (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('testando'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of com.jacqueline.livros.entidades.Autor (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('testando')\n at [Source: (PushbackInputStream); line: 3, column: 13] (through reference chain: com.jacqueline.livros.controller.form.LivroForm["autor"])", "path": "/livros"

5 respostas

Oi Jacqueline,

Posta aqui o código das suas classes Autor e LivroForm, por gentileza.

Oi Rodrigo, segue:

@Entity public class Autor {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;



public String getNome() {
    return nome;
}

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

public Long getId() {
    return id;
}

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

}

public class LivroForm {

private String titulo; private Autor autor;

public String getTitulo() {
    return titulo;
}
public Autor getAutor() {
    return autor;
}
public void setTitulo(String titulo) {
    this.titulo = titulo;
}
public void setAutor(Autor autor) {
    this.autor = autor;
}
public Livro converter() {

    return new Livro(titulo, autor);
}

}

Oi Jacqueline,

Na verdade no seu caso você vai precisar carregar o Autor do banco de dados, para vincular ao livro sendo cadastrado.

Na sua classe LivroForm você está recebendo diretamente um objeto do tipo Autor, mas precisa ao invés disso receber o id ou nome do autor, para fazer um select e carregar a entidade, atribuindo-a ao Livro.

Bem similar ao que foi feito no curso, ao vincular o Curso com o Topico.

Oi Rodrigo, muito obrigada!!

Não seria possível passar o autor de forma manual? sem que ele fosse carregado do banco de dados?

Pior que não.

Você até poderia instanciar um objeto Autor e preencher manualmente os atributos, mas na hora de gravar ia dar exception da JPA, pois o autor não teria sido carregado do banco de dados.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software