Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix 'HTTP-415' error, during POST request in REST web service using spring boot

I am a beginner in Spring Boot and learning my way through.

How to fix 'HTTP-415' error, during POST request in REST web service using Spring Boot as below? I have tried @RequestMapping annotation, @RequestParam. @RequestParam gives some other error 401. However, 415 is consistent with @RequestMapping and @PostMapping.

Issue with @PostMapping request.

{
    "timestamp": "2018-12-31T18:29:36.727+0000",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'text/plain;charset=UTF-8' not supported",
    "trace": "org.springframework.web.HttpMediaTypeNotSupportedException: Content type 
    'text/plain;charset=UTF-8' not supported\r\n\tat 
    org.springframework.web.servlet.mvc.method.annotation.
    AbstractMessageConverterMethodArgumentResolver.
    readWithMessageConverters
    (AbstractMessageConverterMethodArgumentResolver.java:224)\r\n\tat 
     org.springframework.web.servlet.mvc.method.annotation.
     RequestResponseBodyMethodProcessor.
     readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157)
     \r\n\tat org.springframework.web.servlet.mvc.method.
     annotation.RequestResponseBodyMethodProcessor.
     resolveArgument(RequestResponseBodyMethodProcessor.java:130)
     \r\n\tat...................

While placing following request:

Post Request

StudentController.java

@RestController
public class StudentController {
    @Autowired
    private StudentService studentService;
    :
    :

    @PostMapping("/students/{studentId}/courses")
    public ResponseEntity<Void> registerStudentForCourse(
            @PathVariable String studentId,
            @RequestBody Course newCourse) {
        Course course = studentService.addCourse(studentId, newCourse);

        if (course == null)
            return ResponseEntity.noContent().build();

        URI location = ServletUriComponentsBuilder.fromCurrentRequest().
                path("/{id}").buildAndExpand(course.getId()).toUri();

        return ResponseEntity.created(location).build();
    }

StudentService.java

@Component
public class StudentService {
    :
    :
    public Course addCourse(String studentId, Course course) {
        Student student = retrieveStudent(studentId);

        if (student == null) {
            return null;
        }

        String randomId = new BigInteger(130, random).toString(32);
        course.setId(randomId);

        student.getCourses().put(course.getId(), course);

        return course;
    }

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.1.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.in28minutes.springboot</groupId>
 <artifactId>student-services</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>student-services</name>
 <description>Demo project for Spring Boot</description>
 <properties>
  <java.version>1.8</java.version>
 </properties>
 <dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>
<build>
 <plugins>
     <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
 </plugins>
 </build>
</project>
like image 919
Soumali Chatterjee Avatar asked Jan 03 '19 16:01

Soumali Chatterjee


3 Answers

it's clearly in postman you are sending information as form-urlencoded but in your controller, you are expecting a request body (e. json), so you need either change @RequestBody to @ModleAtrributes or send you information with header Content-type: application/json

like image 127
stacker Avatar answered Sep 28 '22 12:09

stacker


Issue is Fixed by adding content header as application/json

enter image description here

like image 31
Soumali Chatterjee Avatar answered Sep 28 '22 12:09

Soumali Chatterjee


Your controller needs no changes. Add consumes and produces to @RequestMapping of your FeignClient. It has worked out even without @Headers:

@FeignClient(name = "myFeignClient", url = "${com.example.url}", configuration = FeignConfiguration.class)
@RequestMapping(value = "feign-my", consumes = "application/json", produces = "application/json")
//@Headers({ACCEPT + ": " + APPLICATION_JSON_VALUE, CONTENT_TYPE + ": " + APPLICATION_JSON_VALUE})
public interface MyFeignClient extends MyController {}
like image 41
Zon Avatar answered Sep 28 '22 11:09

Zon