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

Azure Durable Function问题:Activity函数无法返回带@JsonProperty的Bean

解决Azure Functions Activity返回带@JsonProperty的Java Bean至Orchestrator报错问题

问题出在Durable Functions的序列化机制与Lombok、Jackson注解的兼容性上。默认情况下,Durable Functions无法正确识别带@JsonProperty的Lombok生成Bean,导致序列化失败。以下是可行的解决方法:

方法一:使用Lombok的@Jacksonized注解(推荐)

Lombok 1.18.16及以上版本提供的@Jacksonized注解,能让生成的Builder类自动兼容Jackson序列化规则,包括识别@JsonProperty的字段映射。

修改AuthMessage类:

import com.fasterxml.jackson.annotation.JsonJsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.jackson.Jacksonized;

import java.io.Serializable;

@Data
@Builder
@Jacksonized // 关键注解,让Builder兼容Jackson
@NoArgsConstructor
@AllArgsConstructor
public class AuthMessage implements Serializable {
    @JsonProperty("access_token")
    String accessToken;
    String id;
    String tokenType;
}

确保Lombok版本不低于1.18.16,同时引入Jackson核心依赖:

<!-- Maven依赖示例 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 选择兼容JDK17的版本 -->
</dependency>

方法二:手动配置Jackson序列化器

如果无法升级Lombok版本,可手动指定Durable Functions使用Jackson序列化器,替代默认机制。

普通Azure Functions配置

在Orchestrator触发注解中指定序列化器:

import com.microsoft.azure.functions.durable.DurableOrchestrationClient;
import com.microsoft.azure.functions.durable.jackson.JacksonSerializer;
import com.microsoft.azure.functions.annotation.*;

public class YourOrchestratorFunction {
    @FunctionName("YourOrchestrator")
    public String run(
            @DurableOrchestrationClient(clientSerializer = JacksonSerializer.class) DurableOrchestrationClient client,
            @TriggerParameter(name = "instanceId") String instanceId) {
        // 你的编排逻辑
    }
}

Spring Boot集成的Azure Functions配置

添加配置类指定DurableClientFactory使用JacksonSerializer:

import com.microsoft.azure.functions.durable.DurableClientFactory;
import com.microsoft.azure.functions.durable.jackson.JacksonSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DurableConfig {
    @Bean
    public DurableClientFactory durableClientFactory() {
        return DurableClientFactory.builder()
                .serializer(new JacksonSerializer())
                .build();
    }
}

方法三:显式添加Jackson构造注解

如果以上方法不适用,可给类的全参构造方法添加@JsonCreator和@JsonProperty注解,让Jackson明确识别字段映射:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
public class AuthMessage implements Serializable {
    @JsonProperty("access_token")
    String accessToken;
    String id;
    String tokenType;

    @JsonCreator
    public AuthMessage(
            @JsonProperty("access_token") String accessToken,
            @JsonProperty("id") String id,
            @JsonProperty("token_type") String tokenType) {
        this.accessToken = accessToken;
        this.id = id;
        this.tokenType = tokenType;
    }
}

注意:这种方法需要手动维护构造方法,不如@Jacksonized简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:17:36