1.简介
StructuredOutputConverter 接⼝允许获取结构化输出,例如将输出映射到 Java 类或从⽂本型 AI 模型输出中提取值数组。接⼝定义如下:
有一些大模型不能使用结构化输出,例如deepseek不可以(若不可以需要换一个大模型)
java
public interface StructuredOutputConverter<T> extends Converter<String, T>,
FormatProvider {
}
2.可用转换器
⽬前, SpringAI 提供了 AbstractConversionServiceOutputConverter 、 AbstractMessageOutputConverter 、 BeanOutputConverter 、 MapOutputConverter 和 ListOutputConverter 实现:

下来是具体相关转换器的使⽤。需要注意的是这⾥不能使用流模式 ,使**⽤同步文本模式**。
2.1Bean 输出转换器
以下示例显示了如何使⽤ BeanOutputConverter 为演员⽣成电影作品集。 代表演员电影作品的⽬标记录:
java
record ActorsFilms(String actor, List<String> movies) {}
2.1.1介绍record
record是JDK17才出现的,Java 的 record 是一种简化的不可变数据载体,语法格式为 record 类名(属性列表) {}
例子:
Person类
java
package com.jiazhong.mingxing.ai.siliconflow.glm.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {
private String id;
private String name;
private Character gender;
public void print(){
System.out.println( name+"输出了内容");
}
}
java
record Preson1(String id,String name,Character gender){
public void print(){
System.out.println(name+"输出了内容");
}
}
这两段代码功能相同。
2.1.2案例
一个人
java
record ActorForm(String actor, List<String> movies){}
@GetMapping(value = "/call1" ,produces = "application/json;charset=utf-8")
public ActorForm call1(@RequestParam("question") String question){
return openAiChatClient.prompt()
.user(question)
.call().entity(ActorForm.class);
}

多个人
java
@GetMapping(value = "/call2" ,produces = "application/json;charset=utf-8")
private List<ActorForm> call2(@RequestParam("question") String question){
return openAiChatClient.prompt()
.user(question)
.call()
.entity(new ParameterizedTypeReference<List<ActorForm>>() {
});
}

2.2Map 输出转换器
案例
java
@GetMapping(value = "/call3" ,produces = "application/json;charset=utf-8")
public Map<Object,Object> call3(@RequestParam("question") String question){
return openAiChatClient.prompt()
.user(question)
.call().entity(new ParameterizedTypeReference<Map<Object, Object>>() {
});
}

2.3List 输出转换器
案例
java
@GetMapping(value = "/call4" ,produces = "application/json;charset=utf-8")
public List<String> call4(@RequestParam("question") String question){
return openAiChatClient.prompt()
.user(question)
.call().entity(new ListOutputConverter());
}
