POST Jersey REST 服务收到错误 415 Unsupported Media Type

POST to Jersey REST service getting error 415 Unsupported Media Type

我正在使用带有 Jersey 和 Tomcat 的 JAX-RS 网络应用程序。获取请求很好,但是当我尝试 post JSON 时,我得到一个 HTTP 状态 415 - 不支持的媒体类型。

这是我的简单 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' header):

这是带有库的项目布局:

我正在使用:

谢谢!

我认为您的 post 请求工作正常,但您的 browser/Postman 无法解析服务返回的响应。它正在返回纯文本,Postman 正在等待 json。将 Produce 注释添加到您的 Web 服务并将其也设置为 json。我还建议您检查 Fiddler2 以查看通过线路传输的确切信息。

Jersey 发行版不提供开箱即用的 JSON/POJO 支持。您需要添加 dependencies/jars。

添加所有这些

使用 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。这是您需要注意的主要事项。

检查您的 REST 调用 contentType。它应该是 contentType:'application/json',如果您将 json 数据传递给 POJO class。

浏览了本页和其他页上的大量答案,但无济于事。 这实际上对我有用:

方法一: 与其将 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();
        } 
    }

方法二:

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

我使用的是内部使用 gson (JSON) api 和 jersey 的 firebase APIs JSON 数据绑定需要 jersey-media-json-jackson-2.29.jar.默认 class 路径将 firebase gson API 保留为第一个 JSON API,因此无法正常工作。

为 class 路径序列更改了 manifest.mf,事情开始为我工作。虽然我无法在这种情况下继续使用 Maven,也无法弄清楚如何在 Maven 中添加我们的自定义 class 路径构建 war 的 Manifest.mf。

在动态 Web 项目的 Manifest.mf 中的 class 路径条目下方添加。将我项目的源代码复制到 source 并将 maven 的 jar 下载到 web-inf\lib。使用 eclipse 导出为 WAR 文件创建了 war,一切对我有用。

Class-路径: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 时 class路径冲突造成的。真的很难弄清楚。