@RequestBody不能将JSON映射到Java对象 - Spring Boot

5

我无法将来自post方法体的JSON转换为我的POJO,即使在控制器类中使用了@RequestBody

我调试了错误,并发现某些字段被映射,而其他字段则没有。就像这个(POJO)

name: null, typeOfPlan: null, Email: example@gmail.com, PhoneNum: 123456789, Website: test.org, Username: null, password: 1234,这很奇怪。

JSON:

{
    "confirmPassword": "1234",
    "email": "example@gmail.com",
    "password": "1234",
    "phoneNum": "123456789",
    "name": "Hello world",
    "typeOfPlan": "Test",
    "userName": "user",
    "website": "test.org"
}

控制器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SomeController {

    @Autowired
    private Service foo;

    @CrossOrigin
    @PostMapping(value = "/create")
    private void createAccount(@RequestBody BigFoo bigFoo) {
        foo.createAccount(bigFoo);
    }
}

从这里开始,我调用我的服务,然后调用DAO类。

POJO(普通Java对象)

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BigFoo {

    private String name;
    private String typeOfPlan;
    private String email;
    private String website;
    private String phoneNum;
    private String username;
    private String password;
}

我还尝试在@PostMapping中使用consumes media type以允许JSON,但它未能解决这个问题。

使用Jackson ObjectMapper也无法解决问题。


2
您没有包含实际的JSON内容。 - chrylis -cautiouslyoptimistic-
给我一秒钟。编辑:我添加了在调试模式下出现在我的Object中的确切格式。抱歉,它是我的POJO而不是JSON。 - Compiler v2
1
分享JSON以更好地理解。 - Arun Prasat
它有相同的结果,但我会在我的问题中添加lombok。 - Compiler v2
我和你一样遇到了同样的问题@Compilerv2,但这次奇怪的是我的POJO变量和前端拼写完全相同。 - AKJ
显示剩余5条评论
4个回答

2
我的问题很简单:我的Angular项目中的变量将数据发送到Spring Boot应用程序时拼写错误,因此我的后端应用程序无法识别它们,因此没有正确映射到我的POJO。
在我将前端表单变量更改为匹配我的POJO变量之后,我得到了这个:
POJO数据
name: It's good now, typeOfPlan: 2 Year, Email: example@gmail.com, PhoneNum: 123456789, Website: test.org, Username: Master, password: 1234
Spring Boot无法从JSON中映射名称、typeOfPlan和Username,因为它们与后端中的不匹配。
Before Name,typeOfPlan,userName After name,type,username 谢谢大家!

1
我其实也遇到了同样的问题,简直不敢相信我没有发现它。我的请求中有三个“s”的“password”,而我的眼睛就是看不到它:“passsword”。很高兴你发布了这个帖子,因为它让我回去仔细检查了一遍。 - Marnee

0

首先,如果你正在使用 Postman, curl 等工具,请尝试以该方式发送 json:

{
    "confirmPassword": "1234",
    "email": "example@gmail.com",
    "password": "1234",
    "phoneNum": "123456789",
    "name": "Hello world",
    "typeOfPlan": "Test",
    "userName": "user",
    "website": "test.org"
}

其次,我得到的唯一空值是username,因为您在json中这样发送:userName,您应该检查您的json与您的POJO是否兼容。


不,我没有使用Postman或Curl。我直接从我的前端Angular项目中发送它。 - Compiler v2
我没有发送带有空值的JSON,我不明白你想说什么。 - Compiler v2
我的意思是userName里面有一个大写的N,因此它没有起作用。 - Daniel Taub
我明白了,但是我从我的Chrome检查器中获取了输出console.log()的JSON。因此,它不应该影响我的JSON,因为它只是JSON的表示形式。我从未触碰过它。 - Compiler v2

0

我认为问题出在内容类型上!将其设置为application/json。在Postman或Curl中指定它。

如果你使用JS发送,请尝试这个例子。

axios.post(
                "/rest/yoururl",
                jsObject
            ).then(
                function (response) {
                    console.log(response.data);
                }.bind(this)
            );

默认情况下,内容类型为json

通过curl:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://url

在 Postman 中:
标头 -> 添加键 Content-Type -> 值为 application/json. 如果您使用的是 Postman。

我在哪里找到"content-type",以便将其设置为"application/json"? - Compiler v2
Headers -> 在Postman中,将键Content-Type的值设置为application/json - Alex
哎呀,出问题了。请检查浏览器中的Content-type是什么。 - Alex
这个在我的浏览器哪里?我无法像这里说的那样找到它:https://dev59.com/lGUp5IYBdhLWcg3woorS 我正在检查器的网络选项卡中查看。 - Compiler v2
在Chrome中: 右键单击->检查元素->网络选项卡-> 当您按下表单上的按钮时,会发送一些请求并出现在日志中->单击它->查看其标头->完成。 - Alex
显示剩余2条评论

0
在我的情况下,数据被包裹在括号中,像这样 - {data}。最好仔细检查结构,无论它是数组还是对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接