【问题标题】:Unsupported Media Type Jersey不支持的媒体类型球衣
【发布时间】:2014-05-04 03:32:44
【问题描述】:

我在 Tomcat7 上使用 Maven 和 Jersey 构建 Web 服务器,但我不断收到 415 响应。我的请求是使用 Postman 和 Advanced Rest Client 提出的

我的存根方法:

@POST
@Path("/createuser")
@Consumes(MediaType.APPLICATION_JSON)
public Response createUser(UserInformation user){
    return Response.ok().build();
}

自定义类:

package efile.models;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

@JsonInclude(Include.NON_NULL)
public class UserInformation {
    private String id;
    private String username;
    private String password;
    private String firstName;
    private String lastName;
    private String emailAddress;
    /* getters and setters */
}

请求:

{myhost}/createuser

标题:

接受:应用程序/json

内容类型:应用程序/json

请求正文:

{
"id":"1234567",
"userName":"qwer",
"password":"zxcv",
"firstName":"jasdfme",
"lastName":"qwetad",
"emailAddress": "qwet@gf4elk.com"
}

我的依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.25</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.17</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.17</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17</version>
</dependency>
<dependency>
    <groupId>com.dropbox.core</groupId>
    <artifactId>dropbox-core-sdk</artifactId>
    <version>1.7.6</version>
</dependency>
<dependency>
    <groupId>org.jvnet.mimepull</groupId>
    <artifactId>mimepull</artifactId>
    <version>1.9</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-multipart</artifactId>
    <version>1.17</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.3.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.2.0</version>
</dependency>

谢谢。

【问题讨论】:

  • 上面的 {myhost} 是否包含应用程序的上下文以及 servlet 映射(或 @ApplicationPath 注释)中定义的任何路径部分?
  • 您如何配置 Jackson 将用于 JSON 编组?

标签: json maven jersey


【解决方案1】:

在我这边是因为我忘记添加了

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.18</version>
    </dependency>

之后

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.18</version>
    </dependency>

编译时没有警告/错误,但 415 Unsuported Media Type 在运行时尝试在 AppEngine 上运行的 Jersey 2.18 上使用 JSON 希望对你有帮助

【讨论】:

    【解决方案2】:

    在修改 pom.xml 中的依赖项后,我能够解决该问题。我将球衣依赖更新为 1.18.1 并添加了 fasterxml json 提供程序依赖:

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.2.1</version>
    </dependency>
    

    我的猜测是解决问题的只是 json-provider 依赖项。

    【讨论】:

      【解决方案3】:

      如果您要发送“Accept”标头,您可能还需要将 @Produces(MediaType.APPLICATION_JSON) 注释添加到您的方法中,或者如果您不期望响应正文,请从请求中删除 Accept 标头。

      编辑:

      好的...经过一些实验,我相信我已经能够重现您的问题并找到解决方案。

      我从您的 pom 文件中看到您使用的是 Jersey 1.17。我使用 Jersey 1.18 重现了您的问题,但我怀疑它对 1.17 同样有效。 Jersey 似乎没有内置 Jackson 支持,但必须将 Jackson 作为提供程序安装。我一直将它与诸如 Glassfish 之类的容器一起使用,其中提供者是预先配置的。

      我无法让 Jersey 1.18 与最新的 Jackson 2 库(在 com.fasterxml.jackson groupId 下)一起工作,你正在使用你的 pom.xml,但我能够让它与旧版本一起工作当 groupId 仍然是 org.codehaus.jackson 时的 Jackson 库。似乎 Jersey 1.18 使用了一个名为 com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy 的类,它专门用于 org.codehaus.jackson 中的 Jackson 实现......所以你可能无法制作更新的Jackson 的版本无需升级到 Jersey 的较新版本即可工作。

      首先,我将 XmlRootElement 注释添加到 UserInformation 类。 Jax-RS 将序列化和反序列化 JAXB 对象,并且此注释将此类标记为 JaxB 对象。这需要 pom 对 jaxb-api 的额外依赖:

      <dependency>
          <groupId>javax.xml.bind</groupId>
          <artifactId>jaxb-api</artifactId>
          <version>2.1</version>
      </dependency>
      

      接下来,我从您的 pom.xml 文件中删除了所有 Jersey 依赖项,并添加了对 jersey-server 的依赖项以提供对必要 JaxRS 注释的访问权限:

      <dependency>
          <groupId>com.sun.jersey</groupId>
          <artifactId>jersey-server</artifactId>
          <version>1.18</version>
          <scope>provided</scope>
      </dependency>
      

      然后我全新安装了 Tomcat 7.0.52,并将以下 jar 添加到 CATALINA_HOME/lib 目录:

      • asm-3.3.1.jar(Jackson 使用的字节码操作)
      • jacksore-core-asl-1.9.13.jar(包括 Jackson JSON 提供程序)
      • jersey-bundle-1.18.jar(泽西岛实现)

      我发现有必要将这些 jar 添加到 Tomcat lib 文件夹中,而不是将它们包含在项目 WAR 文件中。我不经常使用 Tomcat,所以我不记得关于何时需要将 jar 放在 Tomcat lib 目录中以及何时将它们包含在 WAR 文件中的规则。

      按照所有这些步骤,我能够从 415 Media Unsupported 错误变为 POST 上的 200 OK。

      我希望这会有所帮助。

      【讨论】:

      • 虽然您确实提交了一个有效的样式点,但这些都不能解决问题。
      • 我不记得 Jersey 使用什么 JSON 解析器,但它也可能对你的 POJO 和 JSON 正文之间的“用户名”大小写不同这一事实很挑剔。关于 Consumes 和 Produces 标头,我知道 RestEasy 可以对它们非常挑剔,所以这不一定是纯粹的文体问题(尽管我知道您没有使用 RestEasy)。抱歉,它没有解决您的问题。
      • 谢谢,很好地解决了案例问题。一般来说,我确实发现泽西岛是区分大小写的,而且我之前一直在使用一个使用“用户名”的代码版本,所以当我修改我的代码时,我忘记了改变它。不过,一般来说,Jersey 会给出一个非常具体的错误消息(目前没有确切的例子,但类似“用户名未标记为可忽略”),所以我认为有一个更大的潜在问题。
      • 感谢您抽出宝贵的时间。正是您的回答使我找到了我找到的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 2019-08-02
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多