Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Problema ao enviar requisição HTTP para Spring

Olá, estou tentando fazer uma página enviar uma requisição POST para meu projeto Spring, porém estou enfrentando um erro. Quando coloco para o Spring receber em forma de String, como está abaixo:

@RestController
@RequestMapping("login")
public class AuthController {
    @PostMapping
    public void login(@RequestBody String data){
    }
}

Ele funciona perfeitamente, porém ao colocar para receber em uma DTO, ele quebra e aparece uma mensagem de erro. Vou deixar o controller, dto e mensagem de erro abaixo:

@RestController
@RequestMapping("login")
public class AuthController {
    @PostMapping
    public void login(@RequestBody UserDataLoginInputDTO data){
    }
}
public record UserDataLoginInputDTO (
        @NotBlank @Email String user,
        @NotBlank String password) {
}
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'text/plain;charset=UTF-8' is not supported]

Pesquisei e não sei o que fazer, abaixo deixarei a forma da minha requisição:

var form = document.querySelector("#form")

form.addEventListener("submit", (event) => {
    event.preventDefault();

    var headers = new Headers();
    headers.append("Content-Type", "application/json")
    headers.append('Access-Control-Allow-Origin', 'http://localhost:8080');
    headers.append('Access-Control-Allow-Credentials', 'true');

    var formData = new FormData(form);
    var data = Object.fromEntries(formData);
    var jsonData = JSON.stringify(data);

    fetch("http://localhost:8080/login",{
        mode: 'no-cors',
        method: "POST",
        headers: headers,
        body: jsonData
    })
    .then(response = response.json())
    .then(result => console.log(result))
    .catch(err => console.log(err))
})

Espero que possam me ajudar. Obrigado!

2 respostas

Oi Pedro, tudo bem?

O erro que você está enfrentando, "Content-Type 'text/plain;charset=UTF-8' is not supported," indica que o Spring não consegue lidar com o tipo de mídia que está sendo enviado na solicitação POST. Nesse caso, você está enviando dados JSON, mas o Spring está interpretando o conteúdo como texto simples ('text/plain').

A causa do erro pode estar relacionada à configuração do cabeçalho "Content-Type" na sua solicitação e como o Spring está configurado para lidar com tipos de mídia. Para resolver esse problema, você pode fazer o seguinte:

  1. Certifique-se de que o cabeçalho "Content-Type" na sua solicitação HTTP está configurado corretamente como "application/json". No seu código JavaScript, você já está fazendo isso com o seguinte trecho:
headers.append("Content-Type", "application/json");
  1. Verifique a configuração do Spring para garantir que ele esteja configurado para lidar com solicitações JSON. Você pode fazer isso adicionando a anotação @RestController em sua classe de configuração principal ou em uma classe de configuração específica.
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
public class WebConfig {
}
  1. Verifique se você tem a biblioteca Jackson (ou outra biblioteca de serialização JSON) no seu classpath. Ela é necessária para converter os dados JSON recebidos em objetos Java.

  2. Certifique-se de que o DTO UserDataLoginInputDTO possui construtores apropriados e as anotações necessárias, como @Data ou @NoArgsConstructor do projeto Lombok, caso esteja usando-o. Isso é importante para que o Spring possa deserializar o JSON na classe corretamente.

Se você seguir essas etapas e ainda enfrentar problemas, certifique-se de que a configuração do Spring para a manipulação de JSON está correta e que a classe UserDataLoginInputDTO está configurada de maneira apropriada para a deserialização do JSON. Além disso, veja se não há outras configurações no Spring que possam estar interferindo na manipulação de JSON.

Um abraço e bons estudos.

solução!

Obrigado pela resposta, o que aconteceu é que eu estava usando o modo "no-cors", deixando impossível utilizar o application/json.