Spring Boot中GET请求如何打印嵌套对象参数?
问题分析与解决方案
你的问题出在对象映射环节,具体是ModelMapper无法正确读取Wallet类的属性,同时可能存在BasketResponse结构不匹配的问题,导致返回的JSON中wallet为空对象。
关键问题点
- Wallet类缺少访问方法:Wallet类的属性是私有,但没有
@Data注解或手动getter/setter,ModelMapper无法读取这些属性,映射时只能生成空的wallet对象。 - BasketResponse结构可能不匹配:如果BasketResponse没有定义对应的wallet字段(或嵌套的WalletResponse字段),会导致序列化后wallet为空。
- 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
相关产品推荐
相关产品推荐

