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

Spring报错找不到默认构造函数但已配置@NoArgsConstructor如何解决

问题根本原因

你犯了一个基础的使用错误:枚举类(enum)不允许被Spring实例化为普通Bean,你不该给枚举类加@Component注解。
枚举的实例是固定的那几个你预先定义的枚举值(HEALTHY_FOOD、JUNK_FOOD等),是JVM在类加载阶段就初始化完成的,无法通过构造方法手动new出新实例,Spring尝试调用构造方法生成枚举Bean的行为本身就违反Java枚举的规范,所以哪怕你加了无参构造也会报错。

你代码中存在的其他问题

  • 你定义的categoryName字段完全没有生效,你声明的9个枚举值都没有传入对应参数,哪怕加了@AllArgsConstructor注解,categoryName也会永远是null
  • 枚举类中定义可变的productList成员变量不符合枚举的使用规范,枚举要求实例不可变,可变成员会引发线程安全问题

修复方案

  1. 直接删除Category枚举类上的@Component注解,不要尝试将枚举交给Spring容器管理
  2. 如果需要在其他Spring Bean中使用Category枚举,直接通过类名调用枚举值即可,不需要注入,示例用法为Category.HEALTHY_FOOD
  3. 如果需要给枚举加自定义属性,要补全枚举值的传入参数,同时将枚举属性设为不可变,调整后的代码参考如下:
package pl.shop.models;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum Category {

    HEALTHY_FOOD("健康食品"),
    JUNK_FOOD("垃圾食品"),
    TEAS_AND_COFFEES("茶与咖啡"),
    SPICES("香料"),
    GRAINS_AND_LENTILS("谷物与豆类"),
    NUTS_AND_SEEDS("坚果与籽类"),
    DRIED_FRUITS("果干"),
    SNACKS("零食"),
    DRINKS("饮品");

    private final String categoryName;
}
  1. 分类对应的商品列表不要存储在枚举类中,单独放到对应的Service、DTO或者数据层实体中管理即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 06:36:03