【问题标题】:Jackson Ignores Parent Class properties sent via JSONJackson 忽略通过 JSON 发送的父类属性
【发布时间】:2021-06-11 21:10:08
【问题描述】:

我正在使用 spring boot 创建 REST 服务并定义了一些具有继承性的类,但是我无法接收从邮递员发送到控制器的 JSON 有效负载。

我正在发送的 JSON 有效负载

{
    "dummy" : "okok",
    "fullName": "okok",
    "mobileNumber": 1234567890

}

我只在控制器中获取虚拟属性,其余属性没有映射到 POJO。 日志记录语句在控制台上打印以下行

ownerAccount OwnerAccount(dummy=okok)

我认为只有 OwnerAccount 构造函数被调用,而 Account 属性没有被初始化。 请帮助我理解我在这里做的缺失部分或错误。 我定义了以下结构:

Account.java

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Account {
    @NotBlank(message = "fullName is mandatory")
    private String fullName;
    @NotNull(message = "mobileNumber is mandatory")
    private Long mobileNumber;
    @Valid
    private AddressRequest addressRequest;
}

OwnerAccount.java

@NoArgsConstructor
@Data
public class OwnerAccount extends Account {
    @NotBlank(message = "dummy is mandatory")
    private String dummy;

}

OwnerController.java

@RestController
@RequestMapping(path = "/api/v1/account/owner")
public class OwnerAccountResource {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private OwnerAccountService ownerAccountService;

    @Autowired
    public OwnerAccountResource(OwnerAccountService ownerAccountService) {
        this.ownerAccountService = ownerAccountService;
    }

    @PostMapping("/signup")
    public ResponseEntity createOwnerAccount(@RequestBody @Valid OwnerAccount ownerAccountRequest) {
        logger.info("ownerAccountDto {}", ownerAccountRequest);
        return ResponseEntity.ok(ownerAccountService.createAccount(ownerAccountRequest));
    }

}

【问题讨论】:

    标签: java json spring-boot


    【解决方案1】:

    我想您认为您无法接收虚拟字段,因为在这里您只打印 Account 字段,因为 @Data 添加了 @ToString 注释,但它没有打印超类字段 logger.info("ownerAccountDto {}", ownerAccountRequest); 但是如果您可以调试该控制器,您会看到虚拟字段在那里。您需要覆盖 toString() 以记录虚拟字段或仅添加 lombok 注释

    @NoArgsConstructor
    @Data
    @ToString(callSuper = true)
    public class OwnerAccount extends Account {
        @NotBlank(message = "dummy is mandatory")
        private String dummy;
    
    }
    

    @ToString(callSuper = true) 将包含来自超类的字段

    【讨论】:

    • 谢谢!我通过添加提到的注释来完成这项工作。我忘记提供包含父类字段的 toString 实现。
    猜你喜欢
    • 2013-03-24
    • 2017-05-31
    • 2019-02-22
    • 1970-01-01
    • 2015-01-12
    • 2017-09-22
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多