当我使用@Requestbody

时间:2018-05-09 11:47:48

标签: spring lombok

我是一名初级网络开发人员 我不明白为什么authenticatedPgInfo返回NULL
以下是我的简单测试。

@RestController
public class InitController {
    @PostMapping("/test")
    public String test(@RequestBody AuthenticatedPgInfo authenticatedPgInfo) {
        return "";
    }
}

@Data
public class AuthenticatedPgInfo {
    private int code;
    private String message;
    private List<AuthenticatedPg> result;
}

如果我将@Data更改为@Getter和@Setter,则authenticatedPgInfo将返回null 但是,当我删除@ Data,@ Getet ...(Lombok Annotation)并生成getter和setter时,它就可以了!!

我不明白为什么龙目岛会在这种情况下工作。 有人可以帮忙吗? 提前谢谢。

test.json

{
  "result": [
    {
       "key": "rabbit",
       "value": "3"
    },
    {
       "key": "lion",
       "value": "1"
    }
  ],
  "message": "success",
  "code": 0
}

3 个答案:

答案 0 :(得分:1)

OMG ......我犯了一个双重错误 我没有在 IntelliJ 中检查Enable annotation processing 所有代码都按预期工作。谢谢你们!

答案 1 :(得分:0)

现在我自己复制了相同的例子 - @Data注释只能按预期工作。

要将json序列化为对象,Jackson需要此对象的默认构造函数(即没有任何参数)或带参数和@JsonCreator注释的构造函数。

默认情况下,如果任何其他构造函数不存在,Lombok会创建默认构造函数。杰克逊使用它。但也许在你的情况下出现了问题,所以你可以使用@JsonCreator注释创建你的DTO,例如:

@Data
public class AuthenticatedPgInfo {
    private int code;
    private String message;
    private List<AuthenticatedPg> result;

    @JsonCreator
    public AuthenticatedPgInfo(@JsonProperty("code") in code,  @JsonProperty("mesage") String message, @JsonProperty("result") List<AuthenticatedPg> result) {
        this.code = code;
        this.message = message;
        this.result = result;
    }
}

答案 2 :(得分:0)

@Data annotation隐式包含@RequiredArgsConstructor,但不包含@NoArgsConstructor。由于Jackson需要一个无参数的构造函数,所以你需要提供一个。你可以通过简单地添加@NoArgsConstructor来实现对Lombok的支持。

@Data
@NoArgsConstructor
public class AuthenticatedPgInfo {
    private int code;
    private String message;
    private List<AuthenticatedPg> result;
}