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
相关产品推荐
相关产品推荐

