SpringAI Alibaba实战文生图

发布于:2025-06-08 ⋅ 阅读:(20) ⋅ 点赞:(0)

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 后,使用URLInputStream读取远程图片流,设置响应头为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 功能的高效落地。


网站公告

今日签到

点亮在社区的每一天
去签到