【问题标题】:POST to Jersey REST service getting error 415 Unsupported Media TypePOST 到 Jersey REST 服务收到错误 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

谢谢!

【问题讨论】:

    标签: java json rest jersey jersey-2.0


    【解决方案1】:

    Jersey 发行版没有开箱即用的 JSON/POJO 支持。您需要添加依赖项/jar。

    添加所有这些

    使用 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 联系以查看通过网络传输的确切信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-16
            • 1970-01-01
            • 2014-01-21
            • 1970-01-01
            • 2021-07-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多