POST 到 Jersey REST 服务收到错误 415 Unsupported Media Type
Posted
技术标签:
【中文标题】POST 到 Jersey REST 服务收到错误 415 Unsupported Media Type【英文标题】:POST to Jersey REST service getting error 415 Unsupported Media Type 【发布时间】:2015-08-06 01:47:45 【问题描述】:我正在使用带有 Jersey 和 Tomcat 的 JAX-RS Web 应用程序。获取请求很好,但是当我尝试发布 JSON 时,我得到一个 HTTP 状态 415 - Unsupported Media Type。
这是我的简单 HelloWorld.java:
package service;
import javax.ws.rs.*;
@Path("hello")
public class HelloWorld
@GET
@Produces("text/plain")
public String get()
return "hello world";
@POST
@Consumes("application/json")
public String post(JS input)
return input.hello;
public static class JS
public String hello;
这是我在 Postman 中尝试的请求(带有 'application/json' 标头):
这是带有库的项目布局:
我正在使用:
Java 7 x64 球衣 2.17 Tomcat 7.0.62 x64谢谢!
【问题讨论】:
【参考方案1】:Jersey 发行版没有开箱即用的 JSON/POJO 支持。您需要添加依赖项/jar。
添加所有这些
jersey-media-json-jackson-2.17 jackson-jaxrs-json-provider-2.3.2 jackson-core-2.3.2 jackson-databind-2.3.2 jackson-annotations-2.3.2 jackson-jaxrs-base-2.3.2 jackson-module-jaxb-annotations-2.3.2 jersey-entity-filtering-2.17使用 Maven,下面将把上面的所有东西都拉进去
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.17</version>
</dependency>
对于任何不使用 Jersey 2.17(并且直接使用 jars 而不是 Maven)的未来读者,您可以转到 here 找到您正在使用的 Jersey 版本,并查看您需要哪些传递依赖版本。此 Jersey 依赖项的当前版本使用 Jackson 2.3.2。这是您需要注意的主要问题。
【讨论】:
会不会有问题,因为他用的是tomcat而不是glassfish? 我已将 jars 添加到 lib.我现在在启动 Tomcat 时收到此错误java.lang.NoClassDefFoundError: org/glassfish/jersey/message/filtering/EntityFilteringFeature
。帮忙?
只需按照上面peeskillet的建议在你的pom文件中添加依赖项。【参考方案2】:
在此页面和其他页面上浏览了很多答案,但无济于事。 这实际上对我有用:
方法一:
不要将JSONObject
作为参数传递给资源方法,而是传递String
。获取String
并用它创建一个JSONObject
然后你可以在你的代码中使用它。像这样,
@Path("/people")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response doGetperson(String jsonRequest)
try
JSONObject requestedJSON = new JSONObject(jsonRequest);
//So now you can use requestedJSON object created to do your stuff
return Response.ok("\"name\":" + requestedJSON.getString("user") + "").build();
catch (Exception ex)
return Response.ok(" \"name\":\"\"").build();
方法 2:
从 2017 年 9 月开始添加此依赖项:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.26</version>
</dependency>
Reference from here
【讨论】:
【参考方案3】:检查您的 REST 调用 contentType。它应该是 contentType: 'application/json',如果你将 json 数据传递给 POJO 类。
【讨论】:
【参考方案4】:我使用的是内部使用 gson (JSON) api 和 jersey JSON 数据绑定的 firebase API,需要 jersey-media-json-jackson-2.29.jar。默认类路径将 firebase gson API 保留为第一个 JSON API,因此无法正常工作。
更改了类路径序列的 manifest.mf,事情开始为我工作。尽管在这种情况下我无法继续使用 maven,也无法弄清楚如何在 Maven 构建的战争的 Manifest.mf 中添加我们的自定义类路径。
在动态 Web 项目的 Manifest.mf 中的类路径条目下方添加。将我的项目的源代码复制到源代码并将 maven jar 下载到 web-inf\lib。使用 eclipse 导出作为 WAR 文件创建了战争,这对我有用。
类路径:jersey-media-json-jackson-2.29.jar jackson-databind-2.9.9.jar gson-2.6.2.jar json-20160212.jar google-http-client-gson-1.21.0 .jar
当您在项目中使用多个 API 时,大多数杂项错误是由于类路径冲突造成的。真的很难弄清楚。
【讨论】:
【参考方案5】:我认为您发布的请求工作正常,但您的浏览器/邮递员无法解析从服务返回的响应。它返回纯文本,邮递员正在等待 json。将 Produce 注释添加到您的 Web 服务并将其也设置为 json。我还建议您与 Fiddler2 联系以查看通过网络传输的确切信息。
【讨论】:
以上是关于POST 到 Jersey REST 服务收到错误 415 Unsupported Media Type的主要内容,如果未能解决你的问题,请参考以下文章
从 Jersey REST 客户端调用时出现 405 错误代码
如何使用POST将Array发送到REST-Service(Jersey)
jersey rest post 访问为http 405 异常如何解决