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

SpringBoot创建产品选项时JSON反序列化失败问题求助

问题根源与修复方案

1. 修复Controller的请求参数与返回值错误

你用Map<String, OptionsDto>接收请求体,但实际发送的JSON是单个OptionsDto对象,并非键值对结构的Map。Jackson会尝试把typeOption对应的字符串"product"转成OptionsDto,直接触发解析错误。另外方法定义返回void却返回ResponseEntity,属于语法错误。

修改后的Controller代码:

@RestController
@RequestMapping("/options")
@RequiredArgsConstructor
public class OptionsController {
    private final OptionsService optionsService;

    @PostMapping("/")
    public ResponseEntity<Options> save(@RequestBody OptionsDto options) {
        return ResponseEntity.ok(optionsService.save(options));
    }
}

2. 修复Ingredients字段类型不匹配

OptionsDto中ingredients定义为String类型,但请求里传的是JSON对象{"option1": "test","option2":"test1"},类型完全不兼容。需调整Dto的字段类型:

如果要接收键值对格式的配料,将ingredients改为Map<String, String>:

@Getter
@Setter
@AllArgsConstructor
@Builder
public class OptionsDto {
    private Integer id;
    private String typeOption;
    // 替换String为Map<String, String>以匹配请求结构
    private Map<String, String> ingredients;
    private String nameCategory;
    private CategoryDto category;

    public static OptionsDto fromEntity(Options options) {
        return OptionsDto.builder()
                .id(options.getId())
                .typeOption(options.getTypeOption())
                .ingredients(options.getIngredients())
                .nameCategory(options.getCategory().getName())
                .build();
    }

    public static Options toEntity(OptionsDto options) {
        return Options.builder()
                .id(options.getId())
                .typeOption(options.getTypeOption())
                .ingredients(options.getIngredients())
                .build();
    }
}

同时要保证Options实体类中ingredients字段也是Map<String, String>类型(若用JPA,需用@ElementCollection或@CollectionTable注解完成映射)。

3. 修复Service实现类的冗余与缺失逻辑

原Service实现里option.setTypeOption(option.getTypeOption());属于无效代码,toEntity方法已经完成属性赋值,直接删除即可。另外你没有调用Repository持久化数据,仅创建了实体对象,必须注入OptionsRepository并调用save方法:

@Service
@RequiredArgsConstructor
public class OptionsServiceImpl implements OptionsService {
    // 注入OptionsRepository
    private final OptionsRepository optionRepository;

    @Override
    public Options save(OptionsDto options) {
        Options option = OptionsDto.toEntity(options);
        // 调用Repository保存到数据库
        return optionRepository.save(option);
    }
}

4. 验证请求数据

当前请求JSON格式已匹配修改后的结构,无需调整:

{"typeOption": "product","ingredients": {"option1": "test","option2":"test1"}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:10:13