-1

I'm a starting web-developer and mostly done stuff with java on Spring boot. Just beginning to get familiar with javascript and right now having a problem that seems similar to many others here on stackoverflow, but the difference seems to be, that everything is working when POSTing with Postman, but when trying with browser via javascript, Il get a 415.

The alert(JSON.stringify(task)) gives (when "taskName"="walk"): {"name":"walk"}

When the same body is POSTed with Postman, the response is:

{
    "id": 65,
    "name": "walk",
    "new": false
} 

Dependencies for jackson-databind, -core and -annotations version 2.10.1 are in use.

The javacode:

var url = contextRoot + "tasks"
var http = new XMLHttpRequest()

http.onreadystatechange = function() {

    alert("readystatechange")

    //if (this.readyState != 4) {
    //    return
    //}
       
    document.getElementById("received").innerHTML = this.responseText
    
}

function addTask() {
   
    var task = {
    name: document.getElementById("taskName").value
    }

    alert(JSON.stringify(task))

    http.open("POST", url)
    http.send(JSON.stringify(task))
}

My @RestController

@RestController
public class TaskController {

    @Autowired
    private TaskRepository taskRepository;

    @GetMapping("/tasks")
    public List<Task> list() {
        return taskRepository.findAll();
    }

    @PostMapping(path = "/tasks", consumes = "application/json", produces = "application/json")
    public Task create(@RequestBody Task task) {
        System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!");
        System.out.println(task);
        return taskRepository.save(task);
    }
    
    /*@PostMapping("/tasks")
    public String create(@RequestBody String task) {
        System.out.println("!!!!!!!!!!!!!!!!!!!!");
        System.out.println(task);
        return "hilipataheijjaa";
    }*/
    
}

HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head lang="en">
        <meta charset="UTF-8" />
        <title>Tasks</title>
    </head>
    <body>

        <h2>Tasks</h2>
                
        <input type="text" id="taskName"/>
        <button onclick="addTask()">Add Task</button>

        
        <p id="received">
        </p>

        <script th:inline="javascript"> var contextRoot = /*[[@{/}]]*/ '';</script>
        <script th:src="@{/javascript/tasks.js}" defer></script>
        </body>
</html>

Task.java

import javax.persistence.Entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.AbstractPersistable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Task extends AbstractPersistable<Long> {

    private String name;

}

The XMLHttpRequest.responseText:

{"timestamp":"2021-06-21T08:27:33.989+00:00","status":415,"error":"Unsupported Media Type","trace":"org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:227)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:422)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:110)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:59)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:395)\r\n\tat org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1234)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1016)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:652)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\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:834)\r\n","message":"Content type 'text/plain;charset=UTF-8' not supported","path":"/tasks"}

Spring console: 2021-06-21 11:27:02.189 WARN 5152 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported] 2021-06-21 11:27:33.988 WARN 5152 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported]

Thank You in advance!

Ratul Sharker
  • 7,484
  • 4
  • 35
  • 44
mortar-1
  • 97
  • 7

2 Answers2

0

The error is obvious. => HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported

//Send the proper header information along with the request
http.setRequestHeader('Content-type', 'application/json');

You can add this and try.

Murat Kara
  • 791
  • 4
  • 15
  • Thank You!! So simple... so many hours. Just had to put it after the ```http.open("POST", url)``` line.. tried first before it, and the code did not run any further than this new line. – mortar-1 Jun 21 '21 at 09:32
  • If this answer worked for you, you can approve the answer. – Murat Kara Jun 21 '21 at 11:37
  • I tried ”voting up”, but: ” Thanks for the feedback! You need at least 15 reputation to cast a vote, but your feedback has been recorded.”. Is there another way to approve? – mortar-1 Jun 22 '21 at 12:04
  • I don't know :D – Murat Kara Jun 22 '21 at 13:27
  • Sorry, took me a while to realize that accepting an answer is different from upvoting. . Now its done. – mortar-1 Aug 14 '21 at 04:55
0

Spring boot Application will return JSON format.

http.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
    var myArr = JSON.parse(this.responseText);
    console.log(myArr);
}
};
S. Anushan
  • 728
  • 1
  • 6
  • 12