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):
这是带有库的项目布局:
我正在使用:
- Java 7 x64
- 球衣 2.17
- Tomcat 7.0.62 x64
谢谢!
我认为您的 post 请求工作正常,但您的 browser/Postman 无法解析服务返回的响应。它正在返回纯文本,Postman 正在等待 json。将 Produce 注释添加到您的 Web 服务并将其也设置为 json。我还建议您检查 Fiddler2 以查看通过线路传输的确切信息。
Jersey 发行版不提供开箱即用的 JSON/POJO 支持。您需要添加 dependencies/jars。
添加所有这些
- 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。这是您需要注意的主要事项。
检查您的 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>
我使用的是内部使用 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路径冲突造成的。真的很难弄清楚。
我正在使用带有 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):
我正在使用:
- Java 7 x64
- 球衣 2.17
- Tomcat 7.0.62 x64
谢谢!
我认为您的 post 请求工作正常,但您的 browser/Postman 无法解析服务返回的响应。它正在返回纯文本,Postman 正在等待 json。将 Produce 注释添加到您的 Web 服务并将其也设置为 json。我还建议您检查 Fiddler2 以查看通过线路传输的确切信息。
Jersey 发行版不提供开箱即用的 JSON/POJO 支持。您需要添加 dependencies/jars。
添加所有这些
- 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。这是您需要注意的主要事项。
检查您的 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>
我使用的是内部使用 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路径冲突造成的。真的很难弄清楚。