【发布时间】:2020-08-22 17:32:51
【问题描述】:
我使用 Spring Boot,POST 方法为我的播放器创建新分数。
在POST 方法中,我检查玩家和游戏是否存在,然后创建新分数并将分数及其相关日期添加到我的分数类的历史记录中。
每个分数都有包含分数及其日期的历史记录。历史具有历史类的类型列表
历史课:
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 + "]";
}
}
分数等级:
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());
我不明白我的错误是什么。
【问题讨论】:
-
你有 `private History h = null;` 所以 h 为空。我看不到你在哪里初始化 h 变量。
-
但是当我定义 History h 时;我有错误
-
在
h.setScore()之前需要h = new Histroy(); -
谢谢你,现在可以工作了
标签: spring mongodb spring-boot spring-mvc