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
相关产品推荐
相关产品推荐

