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

Jersey RESTful服务返回JSON遇500错误,求排查方案

解决Jersey + GlassFish下MessageBodyWriter找不到的问题

我来帮你排查这个问题,这个MessageBodyWriter not found的报错我之前在Jersey项目里也碰到过,主要是序列化相关的配置或实体类写法有问题,咱们一步步来解决:

首先分析报错原因

这个错误本质是Jersey找不到能把你的MyList对象转换成JSON(或XML)的序列化器,常见诱因有三个:

  • 实体类缺少无参构造器:不管是处理JSON的Jackson还是处理XML的JAXB,都需要通过无参构造器创建对象实例,再注入属性;
  • 依赖版本冲突:GlassFish本身自带了Jersey的核心库,你手动引入的jersey-media-json-jackson可能和服务器自带的版本冲突;
  • 实体类的getter/setter不完整:序列化框架需要通过getter读取属性值,缺少的话也会导致序列化失败。

步骤1:修复实体类的写法

你的MyList类只有带参构造器,而且没有完整的getter/setter,这是核心问题之一。修改成下面这样:

package devicemanager;

import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "MyList")
public class MyList {
    private List<String> userList;

    // 必须添加公共的无参构造器
    public MyList() {}

    public MyList(List<String> lst) {
        this.userList = lst;
    }

    // 补全getter和setter方法
    public List<String> getUserList() {
        return userList;
    }

    public void setUserList(List<String> userList) {
        this.userList = userList;
    }
}

步骤2:调整Maven依赖避免冲突

GlassFish 4.1.1自带的Jersey版本正好是你用的2.22.1,所以可以把jersey-media-json-jackson的scope改成provided,让服务器直接用自带的库,避免重复加载:

<?xml version="1.0" encoding="UTF-8"?>
<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>click-digital-backend</groupId>
<artifactId>ClickDigitalBackend</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<scope>provided</scope>
<version>2.22.1</version>
</dependency>
</dependencies>
</project>

如果改成provided还是不行,直接移除这个依赖试试,GlassFish自带的库已经足够支持JSON序列化了。


步骤3:检查Jersey应用配置(可选)

如果你有自定义的Application子类,记得注册Jackson的Feature,确保序列化器被正确加载:

import org.glassfish.jersey.jackson.JacksonFeature;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("/api")
public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(DeviceManager.class);
        // 注册Jackson序列化支持
        classes.add(JacksonFeature.class);
        return classes;
    }
}

如果没有自定义配置类,GlassFish会自动扫描资源类,只要你的DeviceManager类在正确的包下就行。


步骤4:清理重新部署

最后记得做这几步,避免缓存问题:

  1. 停止GlassFish服务器;
  2. 删除domains/domain1/applications下你的应用文件;
  3. 执行mvn clean install重新构建;
  4. 重新部署应用。

你可以先测试/devmanager/string这个接口,如果能正常返回JSON字符串,说明基础配置没问题,再测试返回MyList的接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:06