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

