Spring POST 接收具有 null 值的对象

cat*_*ser 6 javascript java spring angularjs

我有一个 AngularJS Web 应用程序,看起来它正确地将 JSON 发送到 Tomcat 服务器,但服务器收到空值。这个问题没有帮助,因为我的属性名称已经是小写,并且这个问题没有帮助,因为我已经有了符号@RequestBody编辑:正如评论中指出的,我实际上没有这个符号。我读错了。

\n\n

这是有问题的服务器方法:

\n\n
@PostMapping(path="/kind/add")\npublic @ResponseBody String addNewKind(Kind kind) throws Exception {\n    if (kind.getName() == null) {\n        throw new Exception("Name not found.");\n    }\n    kindRepository.save(kind);\n    return "Saved";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是它期望接收的 Kind 对象:

\n\n
@Entity\npublic class Kind {\n\n    @Id\n    @GeneratedValue(strategy=GenerationType.AUTO)\n    private int id;\n    private String name;\n    @OneToMany(mappedBy="kind")\n    private Set<Card> cards;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public Set<Card> getCards() {\n        return cards;\n    }\n\n    public void setCards(Set<Card> cards) {\n        this.cards = cards;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是发出请求的方法:

\n\n
@PostMapping(path="/kind/add")\npublic @ResponseBody String addNewKind(Kind kind) throws Exception {\n    if (kind.getName() == null) {\n        throw new Exception("Name not found.");\n    }\n    kindRepository.save(kind);\n    return "Saved";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是发送到服务器的 JSON:

\n\n
{"name":"Something"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:id我假设我可以在不发送或参数的情况下逃脱cards,因为id它是自动生成的并且cards可以为空;但是,在发送以下 JSON 时,我得到相同的 null 结果:

\n\n
{"id":0,"name":"Something","cards":[]}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些是请求标头:

\n\n
@Entity\npublic class Kind {\n\n    @Id\n    @GeneratedValue(strategy=GenerationType.AUTO)\n    private int id;\n    private String name;\n    @OneToMany(mappedBy="kind")\n    private Set<Card> cards;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public Set<Card> getCards() {\n        return cards;\n    }\n\n    public void setCards(Set<Card> cards) {\n        this.cards = cards;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

kind这是我在调试模式下查看对象参数时服务器收到的内容:

\n\n
kind= Kind\n    cards= null\n    id= 0\n    name= null\n
Run Code Online (Sandbox Code Playgroud)\n

Bri*_*ian 6

您需要在方法上使用@RequestBody注释。您的控制器不知道主体是什么,因此您发布的对象永远不会绑定(或永远不会“创建”)到您的方法的 Kind 参数。

@PostMapping(path="/kind/add")
public String addNewKind(@RequestBody Kind kind) throws Exception {
    if (kind.getName() == null) {
        throw new Exception("Name not found.");
    }
    kindRepository.save(kind);
    return "Saved";
}
Run Code Online (Sandbox Code Playgroud)

如果您期望返回新的“Kind”,您会希望控制器方法如下所示:

@PostMapping(path="/kind/add")
public Kind addNewKind(@RequestBody Kind kind) throws Exception {
    if (kind.getName() == null) {
        throw new Exception("Name not found.");
    }
    return kindRepository.save(kind);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我注意到当您写出 JSON 时,您在 JSON 中使用了单引号。由于您正在使用 转换数据angular.toJson(),因此应该没问题。如果您尝试通过直接发送 JSON 字符串进行交互,这通常不起作用。JSON 不使用单引号。