500内部服务器错误;在spring Boot rest api中使用POST方法时
Posted
技术标签:
【中文标题】500内部服务器错误;在spring Boot rest api中使用POST方法时【英文标题】:500 Internal Server Error; when using POST method in springBoot rest api 【发布时间】: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();
谢谢你,现在可以工作了
【参考方案1】:
初始化两者,之后你不应该得到 NPE
private List<History> history=new ArrayList<>();
private History h = new History();
【讨论】:
【参考方案2】:此行中的字段 h
private History h = null;
可能是像下面这样的局部变量。
else if((p != null) && (g != null))
History h = new History(); //add local variable here.
h.setScore(score.getScore());
【讨论】:
以上是关于500内部服务器错误;在spring Boot rest api中使用POST方法时的主要内容,如果未能解决你的问题,请参考以下文章
内部服务器错误 500,在 Docker 中访问 Spring 引导端点时
无法在 Spring Boot 应用程序之上使用 CXF 运行 swagger
Spring Boot Zuul - Hystrix 短路是 OPEN