简体   繁体   中英

How to insert JSON object into database using spring boot and angularjs?

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.");
    }); 
}

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".

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")

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM