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 异常如何解决

Jersey REST 服务抛出超时异常

如何将PNG图像从Jersey REST服务方法返回到浏览器

Jersey REST API 请求不起作用