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

SpringBoot3+JDK17+CXF4.0.0自定义对象JSON响应报错问题

SpringBoot 3 + CXF 4.0.0 返回自定义JSON对象时出现"No message body writer has been found for class"错误

将项目从SpringBoot 2迁移至SpringBoot 3、JDK升级至17,并把Apache CXF版本从3.4.10升级到4.0.0后,返回自定义对象作为JSON响应时触发No message body writer has been found for class错误。手动通过ObjectMapper将对象转为JSON字符串返回正常,字符串及基本数据类型响应无异常,仅自定义对象返回时报错。

已尝试的无效解决步骤

  • 在jaxrs.classes-scan-packages中添加JSONProvider包,报错依旧
  • 降级Apache CXF版本,问题未解决
  • 分别使用Fasterxml Jackson和Codehaus Jackson,均出现相同错误
  • 添加Jettison依赖,报错情况无改善

相关代码示例

POM.xml 最小依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>JAXRS-POC</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>JAXRS-POC</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <cxf.version>4.0.0</cxf.version>
  </properties>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.15.0-rc1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.15.0-rc1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.15.0-rc1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-jaxrs</artifactId>
      <version>1.9.13</version>
    </dependency>
    <dependency>
      <groupId>jakarta.ws.rs</groupId>
      <artifactId>jakarta.ws.rs-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

实体类

@Getter
@Setter
public class Response{
    private String data;
    private int statusCode;
    private String message;
}

控制器类

@Path("/test")
@Component
@Produces("application/json")
public class TestController{
    @POST
    @Path("/testupload/v1")
    @Consumes(MediaType.MULTIPART_FORM_DATA_VALUE)
    public Response upload(final MultipartBody body){
    
        try{
            Response response = new Response();
            response.setData("Test Data");
            response.setStatusCode(200);
            response.setMessage("Uploaded");
            return response;
        } catch(Exception e){
            // 错误处理
        }
        return null;
    }
}

配置文件 application.yml

cxf:
  path: /api
  servlet:
    init:
      service-list-path: /info
  jaxrs:
    component-scan: true
    classes-scan-packages: org.codehaus.jackson.jaxrs.JacksonJsonProvider

解决方案

核心问题是SpringBoot 3和CXF 4基于Jakarta EE 9+规范,旧版Jackson JAX-RS依赖(基于Java EE)无法兼容,需替换为Jakarta适配版本:

1. 更新Jackson依赖

移除POM中org.codehaus.jackson:jackson-jaxrs,添加Jakarta版本的Jackson JAX-RS包:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.15.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jakarta-xmlbind-annotations</artifactId>
    <version>2.15.2</version>
</dependency>

2. 修正配置文件扫描路径

将classes-scan-packages改为Jakarta版本的JSONProvider全类名:

cxf:
  path: /api
  servlet:
    init:
      service-list-path: /info
  jaxrs:
    component-scan: true
    classes-scan-packages: com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider

3. (可选)手动注册JSONProvider

若自动扫描不生效,可通过配置类手动注册:

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CxfConfig {
    @Bean
    public JacksonJsonProvider jacksonJsonProvider() {
        return new JacksonJsonProvider();
    }
}

4. 确认实体类序列化支持

确保实体类具备正确的getter/setter(已通过Lombok注解实现),无序列化冲突注解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:57:17