1

I am new to Spring boot so the question may sound silly. I want to insert a json object into database. But it is giving me an error like: "Failed to evaluate Jackson deserialization for type". On console, I am getting an error like:

Http 415 Unsupported Media type error with JSON

Here is my POJO class:

@Entity
@Table(name = "academics")
public class Academics {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;
    @Column(name = "adhaarcard")
    private String adhaarCard;
    @Column(name = "grade")
    private List grades;

    public int getId() {
        return id;
    }

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

    public String getAdhaarCard() {
        return adhaarCard;
    }

    public void setAdhaarCard(String adhaarCard) {
        this.adhaarCard = adhaarCard;
    }

    public List getGrades() {
        return grades;
    }

    public void setGrades(List grades) {
        this.grades = grades;
    }

}

My controller function:

@RequestMapping(value="saveacademics",method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> saveAvademics(@RequestBody Academics academics) {

        academicsService.save(academics);   

        URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                .buildAndExpand(academics.getId()).toUri();
        return ResponseEntity.created(location).build();    
}

Angularjs Code:

$scope.saveAcademics = function() {
    var adhaar = sessionStorage.getItem("emp-key");
    var _data = {
        "adhaarCard":adhaar,            
        "grades": {
            "graduation": 
                        { "ssc": "SSC", "hsc": "HSC", "quOne": $scope.qone
                        },
            "specialization": 
                        { 'ssc': "N.A", 'hsc': $scope.hscSpl, 'qoneSpl': $scope.qoneSpl},
            "grade": 
                        { 'ssc': $scope.sscGrade, 'hsc': $scope.hscGrade, 'qoneGrade': $scope.qoneGrade},
            "university": 
                        { 'ssc': $scope.sscUni, 'hsc': $scope.hscUni, 'qoneUni': $scope.qoneUni},
            "year": 
                        { 'ssc': $scope.sscYear, 'hsc': $scope.hscYear, 'qoneYear': $scope.qoneYear}
          }
    };      
    console.log(_data);
    $http({         
        url: 'saveacademics',
        method: "POST",
        data: JSON.stringify(_data)
    })
    .then(function(response) {
        alert("Success");
    }, 
    function(response) { // optional
        alert("Error Occoured.");
    }); 
}
4
  • The reason could be probably because there is no generic type on List? Try adding that maybe? Commented Jul 24, 2019 at 6:23
  • The AngularJS $http service automatically stringifies data. Is it wise to do it twice? Commented Jul 24, 2019 at 6:27
  • post console output of _data. Commented Jul 24, 2019 at 6:55
  • adhaarCard: ""1111111111"" grades: grade: {ssc: "83", hsc: "67", qoneGrade: "60"} graduation: {ssc: "SSC", hsc: "HSC", quOne: "Eng"} specialization: {ssc: "N.A", hsc: "Scii", qoneSpl: "comp sci."} university: {ssc: "Nasik", hsc: "Nasik", qoneUni: "Pune"} year: {ssc: "2007", hsc: "2009", qoneYear: "2013"} Commented Jul 24, 2019 at 7:01

2 Answers 2

1

Try MediaType.APPLICATION_JSON instead on MediaType.APPLICATION_JSON_VALUE

  @RequestMapping(value="saveacademics",method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON)

MediaType.APPLICATION_JSON is a "public constant media type for application/json", whereas MediaType.APPLICATION_JSON_VALUE is a "String equivalent of MediaType.APPLICATION_JSON".

Sign up to request clarification or add additional context in comments.

2 Comments

Throwing an error: "Type mismatch: cannot convert from MediaType to String[]"
try "application/json" in place of MediaType.APPLICATION_JSON
0

Json that you generate from angular js and your Java pojo are not matching.

Better you can reformat json as below

{ adhaarCard: "12", grades : [
 { university: "univ name", specialization: "sadd", grade: 83, graduation:"SSC", year: 2007  },
 { university: "univ name", specialization: "sadd", grade: 67, graduation:"HSC", year: 2009 }
 ]
}

And mapping PoJo class as

    @Column(name = "adhaarcard")
       private String adhaarCard;
    @Column(name = "grade")
       private List<Grades> grades ;

Grades.java

private String university;
private  String specialization;
private  int grade; 
private Sting graduation;
private  int year;

Add Column mapping and getter, setters.

Tip:

Instead of @RequestMapping you can use @PostMapping which is a shorthand. So you wont get confused with media type, it take application/json as default type.

@RequestMapping(value="saveacademics",method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)

replace with

@PostMapping("saveacademics")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.