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

如何配置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。

核心问题分析

  1. Jersey版本冲突:项目同时引入了Jersey 1.x(com.sun.jersey依赖)和Jersey 2.x(org.glassfish.jersey依赖),两者API不兼容,导致JSON序列化组件无法正常加载。
  2. 未注册JSON序列化Provider:Jersey需要明确注册Jackson的JSON处理组件,才能自动将POJO转为JSON。
  3. POJO缺少无参构造函数:Jackson序列化/反序列化需要类有无参构造函数,否则无法实例化对象。
  4. 前端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();
}

验证修改

  1. 重新构建项目并部署到Tomcat。
  2. 点击页面的Get按钮,应收到JSON格式响应,弹出hi提示。
  3. 点击Post按钮,后端控制台输出hello : jersey test,前端弹出ok。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:45:54