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:清理重新部署
最后记得做这几步,避免缓存问题:
- 停止GlassFish服务器;
- 删除
domains/domain1/applications下你的应用文件; - 执行
mvn clean install重新构建; - 重新部署应用。
你可以先测试/devmanager/string这个接口,如果能正常返回JSON字符串,说明基础配置没问题,再测试返回MyList的接口。
内容的提问来源于stack exchange,提问作者Chinaedu Onwukwe
相关产品推荐
相关产品推荐

