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

Spring Boot Azure Function部署后触发HTTP端点报500错误求助

问题排查:Spring Boot Azure Function部署后HTTP触发器返回500错误

我按照相关指南创建Spring Boot Azure Function,该函数在本地可成功构建并运行,但部署后触发HTTP端点https://xxx/api/getUserFunction?userId=abc时,浏览器和Postman均返回500错误,日志显示getUserFunction执行失败。预期该Azure HTTP触发器可返回HTTP 200响应,现附上相关代码与配置,请求协助排查问题:

错误日志

2024-06-15T04:10:37Z   [Information]   Executing 'Functions.getUserFunction' (Reason='This function was programmatically called via the host APIs.', Id=57887aec-5989-45c1-bb34-453059bc2c5b)
2024-06-15T04:10:37Z   [Verbose]   Sending invocation id: '57887aec-5989-45c1-bb34-453059bc2c5b
2024-06-15T04:10:37Z   [Verbose]   Posting invocation id:57887aec-5989-45c1-bb34-453059bc2c5b on workerId:18a329dc-7f2e-4e0b-8487-c67d912b9eea
2024-06-15T04:10:37Z   [Error]   Executed 'Functions.getUserFunction' (Failed, Id=57887aec-5989-45c1-bb34-453059bc2c5b, Duration=5ms)
2024-06-15T04:10:37Z   [Verbose]   [HostMonitor] Checking worker statuses (Count=1)
2024-06-15T04:10:37Z   [Verbose]   [HostMonitor] Worker status: ID=18a329dc-7f2e-4e0b-8487-c67d912b9eea, Latency=1ms
2024-06-15T04:10:37Z   [Verbose]   [HostMonitor] Host process CPU stats (PID 68): History=(0,0,0,0,1), AvgCpuLoad=0.2, MaxCpuLoad=1
2024-06-15T04:10:37Z   [Verbose]   [HostMonitor] Host process CPU stats (PID 26): History=(2,3,2,2,3), AvgCpuLoad=2, MaxCpuLoad=3
2024-06-15T04:10:37Z   [Verbose]   [HostMonitor] Host aggregate CPU load 3
2024-06-15T04:10:37Z   [Information]   Executing StatusCodeResult, setting HTTP status code 200
2024-06-15T04:10:39Z   [Verbose]   Request successfully matched the route with name 'getUserFunction' and template 'api/getUserFunction'
2024-06-15T04:10:39Z   [Information]   Executing 'Functions.getUserFunction' (Reason='This function was programmatically called via the host APIs.', Id=8d7fe07c-108e-4f3b-886e-8a95750737b8)
2024-06-15T04:10:39Z   [Verbose]   Sending invocation id: '8d7fe07c-108e-4f3b-886e-8a95750737b8
2024-06-15T04:10:39Z   [Verbose]   Posting invocation id:8d7fe07c-108e-4f3b-886e-8a95750737b8 on workerId:18a329dc-7f2e-4e0b-8487-c67d912b9eea
2024-06-15T04:10:39Z   [Error]   Executed 'Functions.getUserFunction' (Failed, Id=8d7fe07c-108e-4f3b-886e-8a95750737b8, Duration=5ms)
2024-06-15T04:10:41Z   [Verbose]   Request successfully matched the route with name 'getUserFunction' and template 'api/getUserFunction'
2024-06-15T04:10:41Z   [Information]   Executing 'Functions.getUserFunction' (Reason='This function was programmatically called via the host APIs.', Id=7fba93bb-0744-4af3-8bb3-a604b8a5c4bd)
2024-06-15T04:10:41Z   [Verbose]   Sending invocation id: '7fba93bb-0744-4af3-8bb3-a604b8a5c4bd
2024-06-15T04:10:41Z   [Verbose]   Posting invocation id:7fba93bb-0744-4af3-8bb3-a604b8a5c4bd on workerId:18a329dc-7f2e-4e0b-8487-c67d912b9eea
2024-06-15T04:10:41Z   [Error]   Executed 'Functions.getUserFunction' (Failed, Id=7fba93bb-0744-4af3-8bb3-a604b8a5c4bd, Duration=7ms)

触发器代码

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import io.jaylee.springcloud.model.UserDTO;
import io.jaylee.springcloud.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
@RequiredArgsConstructor
public class FunctionHandler {

    private final UserService userService;

    @FunctionName("createUserFunction")
    public HttpResponseMessage createUser(
            @HttpTrigger(name = "request", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<UserDTO>> request,
            ExecutionContext context) {

        if (request == null) {
            throw new IllegalArgumentException("Request cannot be null");
        }

        context.getLogger()
               .info(request.getBody()
                             .map(UserDTO::toString).orElse(""));
        userService.saveUser(request.getBody().orElseThrow());

        return request
                .createResponseBuilder(HttpStatus.OK)
                .header("Content-Type", "application/json")
                .build();
    }

    @FunctionName("getUserFunction")
    public HttpResponseMessage getUser(
            @HttpTrigger(name = "request", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            ExecutionContext context) {
        String userId = request.getQueryParameters().get("userId");

        if (userId == null || "".equals(userId)) {
            throw new IllegalArgumentException("Request cannot be null");
        }

        context.getLogger().info(userId);
        return request
                .createResponseBuilder(HttpStatus.OK)
                .body(userService.getUser(userId))
                .header("Content-Type", "application/json")
                .build();
    }
}

local.setting.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "FUNCTIONS_EXTENSION_VERSION": "~4",
    "AzureWebJobsDashboard": ""
  }
}

host.json

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

UserService.java

import io.jaylee.springcloud.model.User;
import io.jaylee.springcloud.model.UserDTO;
import io.jaylee.springcloud.repository.UserRepository;
import org.springframework.stereotype.Component;

import java.time.ZonedDateTime;

@Component
public class UserService {

    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public String saveUser(UserDTO userDTO) {
        var user = User.builder()
                       .userId(userDTO.getUserId())
                       .lastName(userDTO.getLastName())
                       .firstName(userDTO.getFirstName())
                       .email(userDTO.getEmail())
                       .createdOn(ZonedDateTime.now())
                       .build();

        return userRepository.save(user).getUserId();
    }

    public UserDTO getUser(String userId) {
        var user = userRepository.findById(userId).orElse(new User());

        return new UserDTO(user.getUserId(),
                           user.getLastName(), user.getFirstName(), user.getEmail());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:45:54