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

Jersey返回JSON报错:MessageBodyWriter not found for application/json

Error 500: MessageBodyWriter not found for media type=application/json in Jersey 2.x

我之前碰到过一模一样的问题,你这个情况核心是Jersey 2.x和旧版1.x的配置不兼容,再加上Jackson的JSON序列化Provider没被正确识别导致的。咱们一步步来解决:

问题根源

你在web.xml里配置的com.sun.jersey.api.json.POJOMappingFeature是Jersey 1.x的专属参数,Jersey 2.x完全不识别这个配置!而且虽然你已经引入了jersey-media-json-jackson依赖,但因为配置错误,Jersey找不到处理JSON序列化的Provider,才会抛出这个500错误。

解决方案

1. 修正web.xml的配置

先删掉那个过时的POJOMappingFeature参数,同时扩展扫描包范围,让Jersey能自动找到Jackson的Provider:

修改后的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <!-- 新增Jackson的包路径,确保Provider能被扫描到 -->
            <param-value>app,org.glassfish.jersey.jackson</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

2. (可选)用Application类手动注册JacksonFeature

如果自动扫描还是没生效,推荐创建一个Jersey配置类手动注册Feature,这种方式更稳定:

创建app.config.JerseyConfig.java:

package app.config;

import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        // 扫描你的业务资源包
        packages("app.resource");
        // 手动注册Jackson JSON序列化Feature
        register(JacksonFeature.class);
    }
}

然后修改web.xml,指定这个配置类:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>app.config.JerseyConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

3. 确认pom.xml依赖没问题

你当前的pom.xml已经正确引入了jersey-media-json-jackson,而且通过bom统一管理了版本,这部分完全没问题,不需要修改。

验证步骤

  1. 先执行mvn clean install重新构建项目
  2. 重启你的Web服务器(比如Tomcat)
  3. 再次调用REST接口,应该就能正常返回JSON响应了

另外,你的Message类已经具备完整的getter/setter和空构造函数,这是Jackson序列化必须的条件,所以这部分不需要调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:36:52