不支持的媒体类型泽西岛

时间:2014-03-26 00:16:50

标签: json maven jersey

我在Tomcat7上使用Maven和Jersey来构建一个Web服务器,但我一直得到415响应。我的请求是使用邮递员和高级休息客户端

我的简短方法:

@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

接头:

接受:application / json

content-type:application / 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>

感谢。

3 个答案:

答案 0 :(得分: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>

编译时没有警告/错误,但运行时尝试在运行于AppEngine上的Jersey 2.18上消耗JSON的415 Unsuported Media Type 希望它有所帮助

答案 1 :(得分:0)

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

编辑:

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

我从您的pom文件中看到您使用的是Jersey 1.17。我使用泽西岛1.18重现了你的问题,但我怀疑它对1.17同样有效。看来泽西岛没有内置杰克逊的支持,但杰克逊必须作为提供者安装。我总是将它用于像Glassfish这样的容器,供应商预先配置好了。

我无法使Jersey 1.18与您使用pom.xml的最新Jackson 2库(在com.fasterxml.jackson groupId下)一起工作,但是我能够使用旧的当groupId仍然是org.codehaus.jackson时杰克逊库。 Jersey 1.18似乎使用了一个名为com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy的类,它专门针对org.codehaus.jackson中的Jackson实现...所以你可能无法创建更新的杰克逊的版本没有升级到更新版本的泽西岛。

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

<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 (杰克逊使用的字节代码操作)
  • jacksore-core-asl-1.9.13.jar (包括杰克逊JSON提供商)
  • jersey-bundle-1.18.jar (泽西实施)

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

按照所有这些步骤,我可以从POST获得415 Media Unsupported错误到200 OK。

我希望这会有所帮助。

答案 2 :(得分:0)

我可以在修改pom.xml中的依赖项后解决此问题。我将球衣依赖关系更新为1.18.1并添加了quickxml json提供程序依赖项:

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

我的猜测是,只有json-provider依赖项解决了这个问题。