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 方法中,我尝试将setScoresetDate 用于History 类的对象,然后通过hrepo 保存它们,这是历史存储库,然后我将其添加到类型的历史变量中List&lt;History&gt;,在那之后我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 中传递信息

无法在 Spring Boot 应用程序之上使用 CXF 运行 swagger

Spring Boot Zuul - Hystrix 短路是 OPEN

如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?

我如何在 Spring Boot/MVC 中创建错误处理程序(404、500...)