如何配置Jersey与Tomcat实现POJO自动转换为JSON?
问题:Jersey返回POJO转JSON时出现500错误
错误信息
2025年8月20日 下午2:00:27 org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
严重: 未找到媒体类型application/json对应的MessageBodyWriter,类型为class com.dan.rest.Message,泛型类型为class com.dan.rest.Message。
核心问题分析
- Jersey版本冲突:项目同时引入了Jersey 1.x(
com.sun.jersey依赖)和Jersey 2.x(org.glassfish.jersey依赖),两者API不兼容,导致JSON序列化组件无法正常加载。 - 未注册JSON序列化Provider:Jersey需要明确注册Jackson的JSON处理组件,才能自动将POJO转为JSON。
- POJO缺少无参构造函数:Jackson序列化/反序列化需要类有无参构造函数,否则无法实例化对象。
- 前端POST请求错误:发送JSON时直接传对象,没有序列化为JSON字符串,导致后端无法解析。
解决方案
1. 修复Maven依赖(统一使用Jersey 2.x)
删除所有Jersey 1.x的依赖,添加Jersey 2.x核心依赖和Jackson JSON支持:
<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>dan</groupId> <artifactId>testmavenproject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>test maven project</name> <description>test maven project</description> <dependencies> <!-- Jersey 2.x核心依赖 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.41</version> <!-- 使用最新稳定版 --> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.41</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.41</version> </dependency> <!-- Jackson JSON支持 --> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.17.2</version> <!-- 与jackson-databind版本一致 --> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.2</version> </dependency> </dependencies> </project>
2. 在Application类中注册Jackson JSON Provider
修改MyApplication.java,添加Jackson的JSON处理组件到注册列表:
package com.dan.rest; import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; @ApplicationPath("rest") public class MyApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> s = new HashSet<Class<?>>(); s.add(TestRest.class); // 注册Jackson JSON Provider s.add(JacksonJsonProvider.class); System.out.println("REST configuration starting: getClasses()"); return s; } }
3. 给Message类添加无参构造函数
Jackson需要无参构造函数来实例化对象,修改Message.java:
package com.dan.rest; public class Message { private String greeting; private String framework; // 添加无参构造函数 public Message() {} // 带参构造函数 public Message(String greeting, String framework) { this.greeting = greeting; this.framework = framework; } // Getters和Setters public String getGreeting() { return greeting; } public String getFramework() { return framework; } public void setGreeting(String greeting) { this.greeting = greeting; } public void setFramework(String framework) { this.framework = framework; } }
4. 修复前端POST请求的JSON序列化
修改newjs.js中的Post()函数,用JSON.stringify()将对象转为JSON字符串:
function Post() { var xhttp = new XMLHttpRequest(); var jsonBody = {greeting:"hello", framework:"jersey test"}; xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { alert(this.responseText); console.log(this.responseText); } }; xhttp.open("POST", "http://localhost:8080/testmavenproject/rest/hello", true); xhttp.setRequestHeader("Content-type", "application/json"); // 将对象序列化为JSON字符串 xhttp.send(JSON.stringify(jsonBody)); } function Get() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { alert(this.responseText); console.log(this.responseText); var jsonVar = JSON.parse(this.responseText); alert(jsonVar.greeting); } }; xhttp.open("GET", "http://localhost:8080/testmavenproject/rest/hello", true); xhttp.setRequestHeader("Accept", "application/json"); xhttp.send(); }
验证修改
- 重新构建项目并部署到Tomcat。
- 点击页面的
Get按钮,应收到JSON格式响应,弹出hi提示。 - 点击
Post按钮,后端控制台输出hello : jersey test,前端弹出ok。
内容的提问来源于stack exchange,提问作者Dan B
相关产品推荐
相关产品推荐

