1️⃣ 前置准备:搭建开发环境与服务配置🚀
🔧 1.1 环境要求
JDK 17+(推荐 JDK 21)、Spring Boot 3.x+(本案例使用 3.3.4)、阿里云百炼大模型服务 API Key。需在阿里云控制台完成服务开通并获取有效 API Key,用于后续身份验证。
🛠️ 1.2 Maven 依赖配置
在pom.xml
中添加 Spring Boot Web 依赖、Spring AI Alibaba Starter,并配置 Spring Milestone 仓库以获取最新组件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.0.0.1</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
🔑 1.3 配置文件设置
在application.yml
中配置服务端口及阿里云 API Key:
server:
port: 8080
spring:
ai:
dashscope:
api-key: "sk-xxx API_KEY"
2️⃣ 核心功能实现:基于 Spring AI 的文生图接口设计🎨
🖼️ 2.1 单图生成:获取图片 URL
接口设计
GET /dashscope/image/generateImage
,通过固定提示词 “为努力学习的自己生成一张励志海报” 调用模型,返回生成图片的 URL。
代码逻辑
使用ImageModel
注入模型实例,构造ImagePrompt
并调用call()
方法,校验返回的 URL 有效性后封装至响应体。若 URL 为空,抛出运行时异常提示生成失败。
example:
/**
* 返回生成图片URL
* @return
*/
@GetMapping("/generateImage")
public BaseResponse<String> generateImage() {
ImagePrompt prompt = new ImagePrompt(PROMOTE);
ImageResponse imageResponse = imageModel.call(prompt);
String imageUrl = imageResponse.getResult().getOutput().getUrl();
if (StrUtil.isEmpty(imageUrl)) {
throw new RuntimeException("Image generation timeout or failed");
}
return ResultUtils.success(imageUrl);
}
🖼️2.2 图片显示:流式传输图片内容
接口设计
GET /dashscope/image
,直接将生成的图片以流形式返回给客户端,支持浏览器直接渲染。
代码逻辑
通过模型调用获取图片 URL 后,使用URL
和InputStream
读取远程图片流,设置响应头为IMAGE_PNG_VALUE
,将字节流写入HttpServletResponse
。捕获 IO 异常并返回 500 状态码,确保错误处理的健壮性。
example:
/**
* 返回显示图片
* @param response
*/
@GetMapping("/image")
public void image(HttpServletResponse response) {
ImagePrompt imagePrompt = new ImagePrompt(PROMOTE);
ImageResponse imageResponse = imageModel.call(imagePrompt);
String imageUrl = imageResponse.getResult().getOutput().getUrl();
try {
URL url = URI.create(imageUrl).toURL();
InputStream in = url.openStream();
response.setHeader("Content-Type", MediaType.IMAGE_PNG_VALUE);
response.getOutputStream().write(in.readAllBytes());
response.getOutputStream().flush();
} catch (IOException e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
🖼️2.3 多图生成:批量生成图片集合
接口设计
POST /dashscope/image/generate/multiImage
,接收包含提示词和图片数量的请求体,支持生成 1-10 张图片。
代码逻辑
校验输入参数合法性(图片数量范围、提示词非空),通过ImageOptionsBuilder
构建批量生成选项,构造带选项的ImagePrompt
。调用模型后解析ImageResponse
,提取所有结果的 URL 并以集合形式返回,满足批量生成需求。
/**
* 返回生成多张图片URL
* @param imageRequest
* @return
*/
@PostMapping("/generate/multiImage")
public BaseResponse<Set<String>> generateMultiImage(@RequestBody ImageRequest imageRequest) {
String imagePrompt = imageRequest.getImagePrompt();
int imageCount = imageRequest.getImageCount();
if (imageCount < 1 || imageCount > 10) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
if (imagePrompt != null && StrUtil.isBlank(imagePrompt)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请输入图片描述提示词");
}
ImageOptions imageOptions = ImageOptionsBuilder.builder().N(imageCount).build();
// # ImagePrompt 传递参数是 -- String 类型和 -- ImageOptions 类型
ImagePrompt result = new ImagePrompt(imagePrompt, imageOptions);
ImageResponse imageResponse = imageModel.call(result);
Set<String> collect = imageResponse.getResults().
stream().map(res -> res.getOutput().getUrl())
.collect(Collectors.toSet());
return ResultUtils.success(collect);
}
3️⃣ 总结 📝
Spring AI 提供的ImageModel
抽象层简化了与阿里云百炼模型的交互,通过统一接口实现不同 AI 服务的无缝切换,适合快速落地文生图场景。
应用场景可扩展至电商海报生成、营销图片批量制作、个性化图片定制等业务场景,结合用户输入动态生成视觉内容,提升产品智能化体验。
通过以上实践,开发者可基于 Spring AI Alibaba 快速构建稳定、可扩展的文生图服务,充分利用 Java 生态与阿里云大模型的协同优势,实现 AI 功能的高效落地。