You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中GET请求如何打印嵌套对象参数?

问题分析与解决方案

你的问题出在对象映射环节,具体是ModelMapper无法正确读取Wallet类的属性,同时可能存在BasketResponse结构不匹配的问题,导致返回的JSON中wallet为空对象。

关键问题点

  1. Wallet类缺少访问方法:Wallet类的属性是私有,但没有@Data注解或手动getter/setter,ModelMapper无法读取这些属性,映射时只能生成空的wallet对象。
  2. BasketResponse结构可能不匹配:如果BasketResponse没有定义对应的wallet字段(或嵌套的WalletResponse字段),会导致序列化后wallet为空。
  3. ModelMapper配置可能未开启深层映射:默认配置下,ModelMapper可能无法自动处理嵌套对象的映射。

分步解决

1. 修复Wallet类的访问权限

给Wallet类添加@Data注解(Lombok),自动生成getter/setter:

@Embeddable
@Data
public class Wallet{
  private String item1;
  private String item2;
  private String item3;
}

如果不用Lombok,就手动添加所有属性的getter和setter方法。

2. 确保BasketResponse结构正确

BasketResponse需要包含与Basket对应的字段,包括嵌套的wallet属性。示例如下:

// BasketResponse类
public class BasketResponse {
    private String owner;
    private String fruit1;
    private String fruit2;
    private String fruit3;
    // 直接引用Wallet类,或使用对应的WalletResponse类
    private Wallet wallet;

    // 如果用WalletResponse,需要定义如下内部类:
    // public static class WalletResponse {
    //     private String item1;
    //     private String item2;
    //     private String item3;
    //     // 同样需要@Data或getter/setter
    // }
}

3. 配置ModelMapper支持嵌套映射

创建ModelMapper的配置类,启用字段匹配和私有字段访问:

@Configuration
public class ModelMapperConfig {
    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration()
                // 启用字段匹配,允许映射私有字段
                .setFieldMatchingEnabled(true)
                .setFieldAccessLevel(org.modelmapper.config.AccessLevel.PRIVATE)
                // 宽松匹配,避免字段名严格大小写问题
                .setMatchingStrategy(MatchingStrategies.LOOSE);
        return modelMapper;
    }
}

如果使用WalletResponse,可添加显式映射规则(字段名一致时可省略):

// 在modelMapper()方法中添加
modelMapper.typeMap(Wallet.class, BasketResponse.WalletResponse.class)
        .addMapping(Wallet::getItem1, BasketResponse.WalletResponse::setItem1)
        .addMapping(Wallet::getItem2, BasketResponse.WalletResponse::setItem2)
        .addMapping(Wallet::getItem3, BasketResponse.WalletResponse::setItem3);

4. 验证数据库数据

确保数据库中BASKETS表对应的wallet字段(item1、item2、item3)有值,否则即使映射正确,返回的wallet也会是空的。


内容的提问来源于stack exchange,提问作者gustop01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:34:53