You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Azure Java Function生成Swagger文件及SpringBoot集成配置指引

解决方案

1. 创建集成Spring Boot的Azure HttpTrigger Java函数项目

环境准备

确保本地已安装:

  • JDK 11/17(Azure Functions Java官方推荐版本)
  • Maven 3.8.x及以上
  • Azure Functions Core Tools(用于本地运行调试)

初始化项目

  1. 用Maven archetype生成基础Azure Functions项目:

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.4.0
    

    按提示输入groupId、artifactId等项目信息。

  2. 引入Spring Boot集成依赖
    在生成的pom.xml中添加以下依赖:

    <!-- Azure Functions Spring Boot Starter -->
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>spring-cloud-azure-function-starter</artifactId>
        <version>4.15.0</version>
    </dependency>
    <!-- Spring Boot 核心依赖(版本可根据实际需求调整) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>3.2.0</version>
    </dependency>
    
  3. 改造函数类为Spring管理的Bean
    将原HttpTrigger函数类添加@Component注解,让Spring容器管理,同时支持注入其他Spring Bean:

    package com.your.package; // 替换为你的实际包路径
    
    import org.springframework.stereotype.Component;
    import com.microsoft.azure.functions.*;
    import com.microsoft.azure.functions.annotation.*;
    import java.util.Optional;
    
    @Component
    public class HttpTriggerFunctions {
        // GET方法示例
        @FunctionName("getItems")
        public HttpResponseMessage getItems(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
            // 业务逻辑:可注入Spring Bean处理
            return request.createResponseBuilder(HttpStatus.OK)
                .body("获取到所有条目")
                .build();
        }
    
        // POST方法示例
        @FunctionName("createItem")
        public HttpResponseMessage createItem(
            @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<Item>> request,
            final ExecutionContext context) {
            Item item = request.getBody().orElseThrow(() -> new IllegalArgumentException("条目数据不能为空"));
            // 业务逻辑:保存条目
            return request.createResponseBuilder(HttpStatus.CREATED)
                .body(item)
                .build();
        }
    }
    
    // 示例实体类
    class Item {
        private String id;
        private String name;
        // 生成getter/setter方法
    }
    
  4. 添加Spring Boot启动类
    创建带@SpringBootApplication的启动类,用于初始化Spring上下文:

    package com.your.package;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class FunctionApplication {
        public static void main(String[] args) {
            SpringApplication.run(FunctionApplication.class, args);
        }
    }
    
  5. 配置host.json
    确保host.json使用最新扩展包,支持Spring集成:

    {
        "version": "2.0",
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[4.*, 5.0.0)"
        }
    }
    

2. 为项目添加Swagger配置

选择Swagger依赖

根据Spring Boot版本选择对应依赖:

  • Spring Boot 2.x:使用SpringFox
  • Spring Boot 3.x:使用SpringDoc(SpringFox已停止维护)

依赖配置

Spring Boot 2.x(SpringFox)
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
Spring Boot 3.x(SpringDoc)
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.2.0</version>
</dependency>

创建Swagger配置类

Spring Boot 2.x(SpringFox)

package com.your.package;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.your.package")) // 你的函数类包路径
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Azure Functions API文档")
                .description("基于Spring Boot集成的Azure HttpTrigger函数API")
                .version("1.0.0")
                .build();
    }
}

Spring Boot 3.x(SpringDoc)

package com.your.package;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Azure Functions API文档")
                        .description("基于Spring Boot集成的Azure HttpTrigger函数API")
                        .version("1.0.0"));
    }
}

为函数添加Swagger注解

在HttpTrigger方法上添加API描述注解,让Swagger自动生成结构化文档:

@Component
public class HttpTriggerFunctions {
    @FunctionName("getItems")
    @ApiOperation(value = "获取条目列表", notes = "返回所有已创建的条目")
    @ApiResponses({
        @ApiResponse(code = 200, message = "请求成功,返回条目列表"),
        @ApiResponse(code = 400, message = "请求参数错误")
    })
    public HttpResponseMessage getItems(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
        return request.createResponseBuilder(HttpStatus.OK).body("获取到所有条目").build();
    }

    @FunctionName("createItem")
    @ApiOperation(value = "创建新条目", notes = "提交条目数据完成创建")
    @ApiResponses({
        @ApiResponse(code = 201, message = "条目创建成功"),
        @ApiResponse(code = 400, message = "条目数据为空或格式错误")
    })
    public HttpResponseMessage createItem(
        @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        @ApiParam(value = "待创建的条目数据", required = true) HttpRequestMessage<Optional<Item>> request,
        final ExecutionContext context) {
        Item item = request.getBody().orElseThrow(() -> new IllegalArgumentException("条目数据不能为空"));
        return request.createResponseBuilder(HttpStatus.CREATED).body(item).build();
    }
}

暴露Swagger UI访问端点

Azure Functions没有内置静态资源访问能力,需创建专门的HttpTrigger函数提供Swagger UI和API文档:

package com.your.package;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResourcesProvider; // SpringFox用此依赖

import java.util.Optional;

@Component
public class SwaggerEndpointFunction {
    private final SwaggerResourcesProvider swaggerResourcesProvider;
    private final ObjectMapper objectMapper;

    // 构造注入
    public SwaggerEndpointFunction(SwaggerResourcesProvider swaggerResourcesProvider, ObjectMapper objectMapper) {
        this.swaggerResourcesProvider = swaggerResourcesProvider;
        this.objectMapper = objectMapper;
    }

    @FunctionName("swagger")
    public HttpResponseMessage swaggerUI(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS, route = "swagger/{*path}") HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
        String path = request.getUri().getPath().replace("/api/swagger/", "");

        // 返回Swagger UI页面
        if (path.isEmpty() || path.equals("index.html")) {
            String swaggerUiHtml = "<html><head><title>Swagger UI</title><link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/swagger-ui-dist@4.18.3/swagger-ui.css'></head><body><div id='swagger-ui'></div><script src='https://cdn.jsdelivr.net/npm/swagger-ui-dist@4.18.3/swagger-ui-bundle.js'></script><script src='https://cdn.jsdelivr.net/npm/swagger-ui-dist@4.18.3/swagger-ui-standalone-preset.js'></script><script>const ui = SwaggerUIBundle({url: '/api/swagger/v2/api-docs', dom_id: '#swagger-ui', presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset]});</script></body></html>";
            return request.createResponseBuilder(HttpStatus.OK)
                    .header("Content-Type", "text/html")
                    .body(swaggerUiHtml)
                    .build();
        }

        // 返回OpenAPI JSON文档(SpringFox)
        if (path.equals("v2/api-docs")) {
            try {
                String apiDocs = objectMapper.writeValueAsString(swaggerResourcesProvider.get());
                return request.createResponseBuilder(HttpStatus.OK)
                        .header("Content-Type", "application/json")
                        .body(apiDocs)
                        .build();
            } catch (JsonProcessingException e) {
                return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR).build();
            }
        }

        return request.createResponseBuilder(HttpStatus.NOT_FOUND).build();
    }
}

测试访问

本地运行Azure Functions(执行mvn azure-functions:run),访问http://localhost:7071/api/swagger即可查看Swagger UI并测试API接口。


内容的提问来源于stack exchange,提问作者Venkatesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:01:16