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统一管理了版本,这部分完全没问题,不需要修改。
验证步骤
- 先执行
mvn clean install重新构建项目 - 重启你的Web服务器(比如Tomcat)
- 再次调用REST接口,应该就能正常返回JSON响应了
另外,你的Message类已经具备完整的getter/setter和空构造函数,这是Jackson序列化必须的条件,所以这部分不需要调整。
内容的提问来源于stack exchange,提问作者Jookooo
相关产品推荐
相关产品推荐

