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

Spring WebFlux简易应用无法返回JSON响应问题排查

解决Spring WebFlux StockPrice类序列化CodecException问题

1. 检查StockPrice类的基础序列化条件

Jackson是Spring WebFlux默认的JSON序列化工具,它要求类满足以下基础条件:

  • 必须包含无参构造函数(如果用了带参构造,需显式声明无参构造,或用Lombok的@NoArgsConstructor注解自动生成)
  • 字段需提供对应的getter方法(或用Lombok的@Getter注解批量生成),或者将字段设为public(不推荐)
  • 若字段名与JSON返回字段名不一致,需用@JsonProperty("目标字段名")指定映射关系

示例合规的StockPrice类:

import lombok.Getter;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;

@Getter
@NoArgsConstructor
public class StockPrice {
    private String symbol;
    private double randomStockPrice;
    private LocalDateTime now;

    // 带参构造用于初始化数据,可选
    public StockPrice(String symbol, double randomStockPrice, LocalDateTime now) {
        this.symbol = symbol;
        this.randomStockPrice = randomStockPrice;
        this.now = now;
    }
}

2. 确认Jackson依赖完整性

Spring WebFlux默认集成Jackson,但如果手动管理依赖,需确保核心包和Java 8时间类型支持包已引入:

<!-- Maven依赖示例 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId> <!-- 处理LocalDateTime等Java 8日期类型 -->
</dependency>

3. 排查WebFlux配置是否覆盖默认序列化器

如果自定义了WebFlux的CodecConfigurer,需确保没有移除Jackson的JSON编解码器:

import org.springframework.context.annotation.Configuration;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.config.WebFluxConfigurer;

@Configuration
public class WebFluxConfig implements WebFluxConfigurer {
    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        // 不要清空默认编解码器,如需自定义,添加而非替换
        configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder());
        configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder());
    }
}

4. 处理特殊类型序列化(如LocalDateTime)

如果StockPrice包含Java 8日期类型,需配置Jackson注册对应的时间模块:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule()); // 注册Java 8时间模块
        // 可选:关闭时间戳序列化,转为字符串格式
        // mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return mapper;
    }
}

5. 验证接口返回逻辑

确保WebFlux接口正确返回Mono<StockPrice>或Flux<StockPrice>类型,而非直接返回对象:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
import java.util.Random;

@RestController
public class StockController {
    @GetMapping("/stock")
    public Mono<StockPrice> getStockPrice() {
        Random random = new Random();
        StockPrice stock = new StockPrice(
            "AAPL",
            150 + random.nextDouble() * 10,
            LocalDateTime.now()
        );
        return Mono.just(stock);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:07:00