внутренняя ошибка сервера 500; при использовании метода POST в springBoot rest api - PullRequest
0 голосов
/ 07 мая 2020

Я использовал метод Spring Boot, POST для создания нового счета для моего игрока. В методе POST я проверяю, существуют ли игрок и игра, затем создаю новый счет, а также добавляю счет и соответствующую дату в историю моего класса оценки. Каждая оценка имеет историю, которая содержит счет и дату. история имеет список типов класса History

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 + "]";
        }

}

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 + "]";
    }

}

И метод POST:

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

        }

В моем методе POST я попытался использовать setScore и setDate для объекта класса History, а затем сохранил их с помощью hrepo, который является репозиторием истории, а затем добавил это в переменную истории введите List<History>, после этого я setHistory моего класса оценок с srepo, репозиторий оценок. Но когда я выполняю свою программу, в PostMan у меня появляется 500 Internal Server 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]

это именно та строка, в которой я setScore объекта h, h.setScore(score.getScore()); I не могу понять, в чем моя ошибка.

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Инициализировать оба, после этого вы не должны получать NPE

private List<History> history=new ArrayList<>();
private History h = new History();
1 голос
/ 07 мая 2020

поле h в этой строке

private History h = null;

может быть локальной переменной, как показано ниже.

 }else if((p != null) && (g != null)) {
   History h = new History(); //add local variable here.
   h.setScore(score.getScore());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...