saharsa
saharsa

Reputation: 497

500 Internal Server Error; when using POST method in springBoot rest api

I used Spring Boot, POST method for create a new score for my player. In POST method, I check if the player and game exists then create new score and also add score and its related date into the history of my score's class. Each score has history which contains score and its date. the history has type list of History's class

The History Class:

package thesisMongoProject;

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "history")
public class History {

        @Id
        private String score;
        private Date date;

        public History(String score, Date date) {
            super();
            this.score = score;
            this.date = date;
        }

        public String getScore() {
            return score;
        }

        public void setScore(String score) {
            this.score = score;
        }

        public Date getDate() {
            return date;
        }

        public void setDate(Date date) {
            this.date = date;
        }

        @Override
        public String toString() {
            return "History [score=" + score + ", date=" + date + "]";
        }

}

The Score Class:

package thesisMongoProject;

import java.util.Date;
import java.util.List;
import javax.validation.constraints.NotBlank;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import com.fasterxml.jackson.annotation.JsonView;

@Document(collection = "score")
public class Score {

    @Id
    @NotBlank
    @JsonView(Views.class)
    private String score;
    @NotBlank
    @JsonView(Views.class)
    private String player;
    @NotBlank
    @JsonView(Views.class)
    private String code;
    @JsonView(Views.class)
    private Date date;
    private List<History> history;

    public Score(@NotBlank String score, String player, String code, List<History> history, Date date) {
        super();
        this.score = score;
        this.player = player;
        this.code = code;
        this.history = history;
        this.date = date;
    }
    public String getScore() {
        return score;
    }
    public void setScore(String score) {
        this.score = score;
    }
    public String getPlayer() {
        return player;
    }
    public void setPlayer(String player) {
        this.player = player;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public List<History> getHistory() {
        return history;
    }
    public void setHistory(List<History> history) {
        this.history = history;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    @Override
    public String toString() {
        return "Score [score=" + score + ", player=" + player + ", code=" + code + ", history=" + history + ", date="
                + date + "]";
    }

}

And the POST method:

@RestController
@RequestMapping("/score")
public class ScoreController {
    @Autowired
    private ScoreRepository srepo;
    @Autowired
    private PlayerRepository prepo;
    @Autowired
    private GamesRepository grepo;
    @Autowired
    private HistoryRepository hrepo;
    private List<History> history;
    private History h = null;

    //Create Score
        @PostMapping
        public ResponseEntity<?> createScore(@RequestBody @JsonView(Views.class) @Valid  Score score) {
            //check player exist
            Player p = prepo.findByNickname(score.getPlayer());
            //check game's cod exist
            Games g = grepo.findByCode(score.getCode());
            //check score exist
            Score s = srepo.findByScore(score.getScore());
             // = hrepo.findByScore(score.getScore());
            if(s != null)
            {
                return ResponseEntity.status(409).body("Conflict!!");
            }else if((p != null) && (g != null)) {
                h.setScore(score.getScore());
                h.setDate(score.getDate());
                hrepo.save(h);
                history.add(h);
                //history.add(hrepo.findById(score.getScore()).get());
                score.setHistory(history);
                srepo.save(score);

                return ResponseEntity.status(201).body("Created!"); 
            }
            else {
                return ResponseEntity.status(400).body("Bad Request!");
            }

        }

In my POST method I tried to setScore and setDate for an object of History class, and then I saved them by hrepo which is history Repository and then I added this to the history variable of type List<History>, after that I setHistory of my score class with srepo, Score repository . But when I execute my program, in PostMan I have 500 Internal Server Error and in the console I have this Error:

java.lang.NullPointerException: null
    at thesisMongoProject.controller.ScoreController.createScore(ScoreController.java:63) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]

which is exactly the line that I setScore of object h, h.setScore(score.getScore()); I cannot understand what is my mistake.

Upvotes: 1

Views: 7094

Answers (2)

Kaz
Kaz

Reputation: 416

field h in this line

private History h = null;

may be local variable like below.

 }else if((p != null) && (g != null)) {
   History h = new History(); //add local variable here.
   h.setScore(score.getScore());

Upvotes: 1

Gaurav Dhiman
Gaurav Dhiman

Reputation: 1023

Initialize both, you should not get NPE after that

private List<History> history=new ArrayList<>();
private History h = new History();

Upvotes: 2

Related Questions