Erro Bad Request
03/03/2023
0
Olá pessoal, estou aprendendo o desenvolvimento com Spring Boot 3 e no meu trabalho estou (tentando) desenvolvendo uma aplicação para gerir um comércio de compra e venda de cafés. Criei a base de dados em MySql, criei as entities (de acordo com as tabelas), criei os dto's, os repositórios e criei de um controller. Ao tentar acessar a primeira url de cadastro começou a dar erro de Bad Request e não estou conseguindo corrigí-lo. Alguém pode me ajudar, por favor?
Descrição do erro no Insomnia:
Descrição do erro no Insomnia:
{ "timestamp": "2023-03-03T11:52:07.777+00:00", "status": 400, "error": "Bad Request", "trace": "org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<com.minascafe.api.responses.Cafe_CocoResponse<com.minascafe.api.dtos.Cafe_CocoDto>> com.minascafe.api.controllers.CafeCocoController.cadastrar(com.minascafe.api.dtos.Cafe_CocoDto,org.springframework.validation.BindingResult) throws java.security.NoSuchAlgorithmException\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:166)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:136)\r\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:181)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:148)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:731)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:833)\r\n", "message": "Required request body is missing: public org.springframework.http.ResponseEntity<com.minascafe.api.responses.Cafe_CocoResponse<com.minascafe.api.dtos.Cafe_CocoDto>> com.minascafe.api.controllers.CafeCocoController.cadastrar(com.minascafe.api.dtos.Cafe_CocoDto,org.springframework.validation.BindingResult) throws java.security.NoSuchAlgorithmException", "path": "/cadastrar_cafecoco" }
Edson
Curtir tópico
+ 0
Responder
Posts
03/03/2023
Edson
Arquivo Controller:
package com.minascafe.api.controllers;
import java.security.NoSuchAlgorithmException;
import javax.naming.Binding;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.minascafe.api.dtos.Cafe_CocoDto;
import com.minascafe.api.entities.Cafe_Coco;
import com.minascafe.api.responses.Cafe_CocoResponse;
import com.minascafe.api.services.Cafe_Coco_Service;
import jakarta.validation.Valid;
@RestController //Endpoint (página web) de Controller
@RequestMapping("/cadastrar_cafecoco") //Define a url da classe - "mapeando a requisição"
//@CrossOrigin(origins = "*") //Permite que as requisições venham de lugares distintos
public class CafeCocoController {
public static final Logger log = LoggerFactory.getLogger(CafeCocoController.class); //Log para adicionar entradas no console
@Autowired
private Cafe_Coco_Service cafe_Coco_Service;
/**
* Cadastra um lote de café em côco no sistema
*
* @param cafe_cocoDto
* @return ResponseEntity<Response<Cafe_CocoDto>>
* @throws NoSuckAlgorithmException
*/
@PostMapping//Verbo Http de 'Cadastro'
public ResponseEntity<Cafe_CocoResponse<Cafe_CocoDto>> cadastrar(@Valid @RequestBody Cafe_CocoDto cafe_cocoDto,//RequestBody pega os dados do request e converte em um Dto. @Valid chama a validação que eu criei no Dto.
BindingResult result) throws NoSuchAlgorithmException{//Exceção da parte de geração de senhas - BindingResult - terá a informação do resultado da validação do Dto.
System.out.println(cafe_cocoDto);
log.info("Cadastrando um café em côco: {}", cafe_cocoDto.toString()); //passa os dados que chegaram via Post Request
Cafe_CocoResponse<Cafe_CocoDto> response = new Cafe_CocoResponse<Cafe_CocoDto>(); //Criando uma instância de Cafe_CocoResponse que será utilizado para retornar os dados.
//validarDadosExistentes(cafe_cocoDto, result);
Cafe_Coco cafe_coco = this.converterDtoParaCafeCoco(cafe_cocoDto);
if (result.hasErrors()) { //Se possui erros de validação
log.error("Erro validando dados de cadastro de café em côco: {}", result.getAllErrors());
result.getAllErrors().forEach(error -> response.getErrors().add(error.getDefaultMessage()));
return ResponseEntity.badRequest().body(response);
}
this.cafe_Coco_Service.persistir(cafe_coco);
return ResponseEntity.ok(response);
}
private void validarDadosExistentes(Cafe_CocoDto cafe_CocoDto, BindingResult result) { //Verifica se esse café em côco já existe no banco de dados
this.cafe_Coco_Service.buscarPorProdutor(cafe_CocoDto.getProdutor())
.ifPresent(emp -> result.addError/*Adicionando um erro ao result */(new ObjectError("cafe_Coco", "Este café em Côco já existe!")));
}
private Cafe_Coco converterDtoParaCafeCoco(Cafe_CocoDto cafe_cocoDto) {
Cafe_Coco cafe_coco = new Cafe_Coco();
cafe_coco.setLote(cafe_cocoDto.getLote());
cafe_coco.setData(cafe_cocoDto.getData());
cafe_coco.setProdutor(cafe_cocoDto.getProdutor());
cafe_coco.setQuilos(cafe_cocoDto.getQuilos());
cafe_coco.setSacos(cafe_cocoDto.getSacos());
return cafe_coco;
}
}
package com.minascafe.api.controllers;
import java.security.NoSuchAlgorithmException;
import javax.naming.Binding;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.minascafe.api.dtos.Cafe_CocoDto;
import com.minascafe.api.entities.Cafe_Coco;
import com.minascafe.api.responses.Cafe_CocoResponse;
import com.minascafe.api.services.Cafe_Coco_Service;
import jakarta.validation.Valid;
@RestController //Endpoint (página web) de Controller
@RequestMapping("/cadastrar_cafecoco") //Define a url da classe - "mapeando a requisição"
//@CrossOrigin(origins = "*") //Permite que as requisições venham de lugares distintos
public class CafeCocoController {
public static final Logger log = LoggerFactory.getLogger(CafeCocoController.class); //Log para adicionar entradas no console
@Autowired
private Cafe_Coco_Service cafe_Coco_Service;
/**
* Cadastra um lote de café em côco no sistema
*
* @param cafe_cocoDto
* @return ResponseEntity<Response<Cafe_CocoDto>>
* @throws NoSuckAlgorithmException
*/
@PostMapping//Verbo Http de 'Cadastro'
public ResponseEntity<Cafe_CocoResponse<Cafe_CocoDto>> cadastrar(@Valid @RequestBody Cafe_CocoDto cafe_cocoDto,//RequestBody pega os dados do request e converte em um Dto. @Valid chama a validação que eu criei no Dto.
BindingResult result) throws NoSuchAlgorithmException{//Exceção da parte de geração de senhas - BindingResult - terá a informação do resultado da validação do Dto.
System.out.println(cafe_cocoDto);
log.info("Cadastrando um café em côco: {}", cafe_cocoDto.toString()); //passa os dados que chegaram via Post Request
Cafe_CocoResponse<Cafe_CocoDto> response = new Cafe_CocoResponse<Cafe_CocoDto>(); //Criando uma instância de Cafe_CocoResponse que será utilizado para retornar os dados.
//validarDadosExistentes(cafe_cocoDto, result);
Cafe_Coco cafe_coco = this.converterDtoParaCafeCoco(cafe_cocoDto);
if (result.hasErrors()) { //Se possui erros de validação
log.error("Erro validando dados de cadastro de café em côco: {}", result.getAllErrors());
result.getAllErrors().forEach(error -> response.getErrors().add(error.getDefaultMessage()));
return ResponseEntity.badRequest().body(response);
}
this.cafe_Coco_Service.persistir(cafe_coco);
return ResponseEntity.ok(response);
}
private void validarDadosExistentes(Cafe_CocoDto cafe_CocoDto, BindingResult result) { //Verifica se esse café em côco já existe no banco de dados
this.cafe_Coco_Service.buscarPorProdutor(cafe_CocoDto.getProdutor())
.ifPresent(emp -> result.addError/*Adicionando um erro ao result */(new ObjectError("cafe_Coco", "Este café em Côco já existe!")));
}
private Cafe_Coco converterDtoParaCafeCoco(Cafe_CocoDto cafe_cocoDto) {
Cafe_Coco cafe_coco = new Cafe_Coco();
cafe_coco.setLote(cafe_cocoDto.getLote());
cafe_coco.setData(cafe_cocoDto.getData());
cafe_coco.setProdutor(cafe_cocoDto.getProdutor());
cafe_coco.setQuilos(cafe_cocoDto.getQuilos());
cafe_coco.setSacos(cafe_cocoDto.getSacos());
return cafe_coco;
}
}
Responder
03/03/2023
Edson
Application.properties:
#logging.level.com.minascafe=DEBUG
#MySQL
#Não cria nenhuma entidade no banco, será feito manualmente
spring.jpa.hibernate.ddl-auto=none
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url= jdbc:mysql://localhost:3306/minas_cafe
spring.datasource.username=root
spring.datasource.password=359423
#exibe os comandos SQL
#Exibe as queries executadas pela aplicação Java
spring.jpa.properties.hibernate.show-sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.type=trace
spring.jpa.show-sql=true
security.basic.enable=false
#logging.level.com.minascafe=DEBUG
#MySQL
#Não cria nenhuma entidade no banco, será feito manualmente
spring.jpa.hibernate.ddl-auto=none
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url= jdbc:mysql://localhost:3306/minas_cafe
spring.datasource.username=root
spring.datasource.password=359423
#exibe os comandos SQL
#Exibe as queries executadas pela aplicação Java
spring.jpa.properties.hibernate.show-sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.type=trace
spring.jpa.show-sql=true
security.basic.enable=false
Responder
Clique aqui para fazer login e interagir na Comunidade :)