跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava

Java 快速集成 Dify AI 平台实践

在 Java Spring Boot 项目中集成 Dify AI 平台,通过配置 Maven 依赖引入 WebFlux 和 Fastjson,使用 WebClient 发送流式请求至 Dify API。实现 Controller 层接收查询并返回 Flux 流响应,Service 层构建请求体和处理逻辑。提供实体类定义及配置文件示例,并针对 401 未授权和 500 服务器错误提供排查建议。

观心发布于 2026/3/15更新于 2026/10/23114 浏览
Java 快速集成 Dify AI 平台实践

一、Dify 简介

Dify 是一个开源的 AI 应用开发平台,旨在帮助开发者快速构建和部署基于大语言模型(LLM)的应用。它提供了可视化的界面和丰富的工具,简化了 AI 应用的开发流程。

Dify 内置知识库管理功能,支持上传文档并自动处理为可检索的知识片段,方便构建基于知识的问答系统。

Dify 适用于构建智能客服、内容生成、数据分析报告等多种 AI 应用场景,特别适合企业和个人开发者快速实现 AI 创意。

开源特性使得 Dify 可以免费使用和自定义修改,社区持续提供更新和支持,降低了 AI 应用开发的门槛。

二、准备工作

  1. 获取 API 密钥
    • 登录 Dify 平台控制台
    • 在「API 密钥」模块创建新的密钥
  2. 搭建 Java 环境
    • JDK 1.8 及以上
    • 新建一个 Spring Boot 项目,导入相关的依赖文件,完整的依赖文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>AiDify</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.36</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.58</version>
        </dependency>
    </dependencies>
</project>

三、实现过程

1. Controller 层代码

import com.wang.entity.MessageVO;
import com.wang.entity.StreamResponse;
import com.wang.service.DifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/api")
public class DifyController {
    @Value("${dify.api.key}")
    private String difyKey;

    @Autowired
    private DifyService difyService;

    @PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<StreamResponse> difyStream(@RequestBody MessageVO vo) {
        return difyService.streamingMessage(vo.getQuery(), 0L, difyKey)
                .onErrorResume(throwable -> {
                    StreamResponse errorResponse = new StreamResponse();
                    errorResponse.setAnswer("Stream processing error: " + throwable.getMessage());
                    return Flux.just(errorResponse);
                });
    }
}

2. Service 层代码

import com.wang.entity.StreamResponse;
import reactor.core.publisher.Flux;

public interface DifyService {
    Flux<StreamResponse> streamingMessage(String query, Long userId, String apiKey);
}
import com.alibaba.fastjson.JSON;
import com.wang.entity.DifyRequestBody;
import com.wang.entity.StreamResponse;
import com.wang.service.DifyService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import java.util.HashMap;

@Service
@RequiredArgsConstructor
public class DifyServiceImpl implements DifyService {
    @Value("${dify.api.url}")
    private String url;
    private final WebClient webClient;

    /**
     * @param query 查询文本
     * @param userId 用户 id
     * @param apiKey apiKey
     * @return Flux 响应流
     */
    public Flux<StreamResponse> streamingMessage(String query, Long userId, String apiKey) {
        // 1.设置请求体
        DifyRequestBody body = new DifyRequestBody();
        body.setInputs(new HashMap<>());
        body.setQuery(query);
        body.setResponseMode("streaming");
        body.setConversationId("");
        body.setUser(userId.toString());

        // 2.使用 webclient 发送 post 请求
        return webClient.post()
                .uri(url)
                .headers(httpHeaders -> {
                    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
                    httpHeaders.setBearerAuth(apiKey);
                })
                .bodyValue(JSON.toJSONString(body))
                .retrieve()
                .bodyToFlux(StreamResponse.class);
    }
}

3. 实体类代码

import lombok.Data;
import java.io.Serializable;
import java.util.Map;

/**
 * Dify 请求体.
 */
@Data
public class DifyRequestBody implements Serializable {
    /**
     * 用户输入/提问内容.
     */
    private String query;

    /**
     * 允许传入 App 定义的各变量值.
     */
    private Map<String, String> inputs;

    /**
     * 响应模式,streaming 流式,blocking 阻塞.
     */
    private String responseMode;

    /**
     * 用户标识.
     */
    private String user;

    /**
     * 会话 id.
     */
    private String conversationId;
}
@Data
public class StreamResponse implements Serializable {
    String event;
    String id;
    String taskId;
    String messageId;
    String answer;
    Long createdAt;
    String conversationId;
}
@Data
public class MessageVO {
    private String query;
}

4. Config 代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {
    @Bean
    public WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }

    @Bean
    public WebClient webClient(WebClient.Builder builder) {
        return builder.build();
    }
}

5. 配置文件

spring:
  application:
    name: app
  server:
    port: 8080
  dify:
    api:
      url: 你自己的 url
      key: app-你自己的密钥

四、常见问题排查

  1. 401 未授权错误
    • 检查 API 密钥是否正确
    • 确认请求头 Authorization 格式正确
  2. 500 服务器错误
    • 检查请求参数格式是否是 json 格式
{
  "query": "你好"
}

目录

  1. 一、Dify 简介
  2. 二、准备工作
  3. 三、实现过程
  4. 1. Controller 层代码
  5. 2. Service 层代码
  6. 3. 实体类代码
  7. 4. Config 代码
  8. 5. 配置文件
  9. 四、常见问题排查

更多推荐文章

查看全部
  • Android 锁屏服务实现与电话状态监听
  • C++ 核心基础概念解析
  • OpenDroneMap 无人机影像处理与地理数据生成指南
  • Go Web 开发基础:模板引擎与控制器实战
  • 基于 Docker 部署 Jenkins 与 Playwright 实现 Web 自动化测试
  • Claude Code vs GitHub Copilot CLI 终端开发深度评测
  • GitHub 项目上传实战指南
  • 动态规划路径类 DP 入门:最小路径和、迷雾森林与过河卒
  • OpenClaw 开源桌面 Agent 部署与飞书钉钉集成实战指南
  • 利用腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • 基于腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • ROS1 全局参数:定义、获取与修改实战
  • 本地电脑训练专属大模型实战教程
  • Java JDK 安装与环境配置教程(Windows + macOS 通用)
  • SpringBoot3 + OpenSpec 实现 MCP 服务器实践
  • C++ 手写 JSON 与 HTTP Web 服务器实战
  • 金仓数据库 Oracle 与 SQL Server 迁移适配指南
  • GitHub Copilot Pro 学生认证免费获取详细指南
  • WebEx Player:播放.wrf 格式会议录制文件的官方方案
  • Spring Web 模块核心概念与基础架构解析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online