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

Spring AI枚举Schema不支持enumNames的解决方案咨询

Spring AI Schema生成器为枚举类型添加enumNames字段的实现方案

经测试发现,Spring AI的Schema生成器默认不会为枚举类型生成enumNames字段,当前生成的Schema示例如下:

"myEnum": {
  "type": "string",
  "enum": ["myEnumValue1", "myEnumValue2", "myEnumValue3"],
  "description": "My myEnumValues"
},

期望生成包含enumNames属性的Schema格式:

"myEnum": {
  "type": "string",
  "enum": ["myEnumValue1", "myEnumValue2", "myEnumValue3"],
  "enumNames": ["myEnumValue1LongName", "myEnumValue2LongName", "myEnumValue3LongName"],
  "description": "My myEnumValues"
},

以下是可行的实现方案:

1. 自定义枚举名称注解

先定义一个注解,用于标记枚举值对应的长名称:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumName {
    String value();
}

在目标枚举类中使用该注解:

public enum MyEnum {
    @EnumName("myEnumValue1LongName")
    MY_ENUM_VALUE1,
    @EnumName("myEnumValue2LongName")
    MY_ENUM_VALUE2,
    @EnumName("myEnumValue3LongName")
    MY_ENUM_VALUE3;
}

2. 扩展EnumSchemaGenerator

继承Spring AI默认的EnumSchemaGenerator,重写生成逻辑,注入enumNames字段:

import org.springframework.ai.schema.Schema;
import org.springframework.ai.schema.type.EnumSchemaGenerator;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class CustomEnumSchemaGenerator extends EnumSchemaGenerator {

    @Override
    public Schema generate(Class<?> type) {
        Schema schema = super.generate(type);
        if (type.isEnum()) {
            List<String> enumNames = new ArrayList<>();
            for (Object enumConstant : type.getEnumConstants()) {
                try {
                    Field field = type.getField(enumConstant.toString());
                    EnumName enumNameAnnotation = field.getAnnotation(EnumName.class);
                    enumNames.add(enumNameAnnotation != null ? enumNameAnnotation.value() : enumConstant.toString());
                } catch (NoSuchFieldException e) {
                    enumNames.add(enumConstant.toString());
                }
            }
            schema.getProperties().put("enumNames", enumNames);
        }
        return schema;
    }
}

3. 替换默认生成器

通过SchemaGeneratorCustomizer将自定义生成器注册到Spring AI的Schema生成器中:

import org.springframework.ai.schema.SchemaGenerator;
import org.springframework.ai.schema.SchemaGeneratorCustomizer;
import org.springframework.stereotype.Component;

@Component
public class CustomSchemaGeneratorCustomizer implements SchemaGeneratorCustomizer {

    @Override
    public void customize(SchemaGenerator schemaGenerator) {
        // 移除默认的枚举生成器
        schemaGenerator.getTypeGenerators().removeIf(generator -> generator instanceof EnumSchemaGenerator);
        // 添加自定义生成器
        schemaGenerator.getTypeGenerators().add(new CustomEnumSchemaGenerator());
    }
}

完成以上步骤后,重新生成枚举类型的Schema,即可得到包含enumNames字段的预期格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:33:19