【问题标题】:HTTP 415 Unsupported Media TypeHTTP 415 不支持的媒体类型
【发布时间】:2015-08-29 18:43:40
【问题描述】:

我创建了一个示例 Web 服务来进行后期调用。

我正在使用 Jersey JAX-RS 和 Maven。

web.xml

<servlet>
    <servlet-name>provider-serlvet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>org.is.ws.provider.rest.ProviderAggregateApplication</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
         </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>provider-serlvet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

POM.XML

<!-- Jersey jars -->

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.19</version>
    </dependency> 
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.19</version>
    </dependency>           
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.19</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>1.19</version>
    </dependency>
      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.18</version>
      </dependency>
      <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

方法调用:

@POST
@Path(RESOURCE_PATH)
@Produces("text/plain")
public String getPCP(){
    return "Hello";
}

原始请求:

 POST http://localhost:9080/sep/pas/getPCP HTTP/1.1
 Connection: close
 Accept-Encoding: gzip,deflate
 Content-Type: application/json
 Content-Length: 69
 Host: localhost:9080
 User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

  {
    "patientID": "1234567890",
    "patientIDType": "XYZ"
  }

我参考了下面的文章

REST Webservice returning 415 - Unsupported Media Type

但我仍然有问题。

【问题讨论】:

  • 如果接收请求的容器无法将请求映射到相应的方法,通常会抛出异常。因此,您是否在班级级别定义了@Path? RESOURCE_PATH 是什么?是/sep/pas/getPCP 吗?此外,您通过@Consumes 声明了一个 JSON 媒体类型,但没有提供任何可以接收此发送的 JSON 正文的参数(对象、字符串、POJO、...)
  • @RomanVottner resource_path 工作正常。我认为这没有任何问题,因为我使用相同的resource_path 代替@Get 并且它有效。使用@Consumes,我在方法之前将其删除,并在我的方法中返回一个字符串。我仍然得到 415
  • 如果您出于测试目的将@Consumes 声明更改为plain/text,是否还会收到415?如果没有,那么来自 JSON 的自动编组可能会失败。
  • 我编辑了我的方法调用,没有@consumes。我正在做一个简单的 post call 并期待一个字符串作为输出。
  • 您是否尝试为getPCP 指定String 参数?另外,尝试将请求的内容类型更改为plain/text

标签: java web-services maven jax-rs


【解决方案1】:

我删除了 pom.xml 中的所有依赖代码,并添加了以下代码,其中包含 jersey-core、jersey-bundle、jersey-json

 <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.19</version>
</dependency>

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,可能是您忘记了 Patient 类的默认无参数构造函数。

    详细地说,我在通过 PUT/PUSH 请求向我的 JAX-rs 服务发送序列化为 JSON 的对象时遇到了相同的 415 http 错误,换句话说,我的服务器无法从JSON。 在我的例子中,服务器在将它们发送到它的响应中时能够成功地序列化 JSON 中的相同对象。

    正如其他回复中提到的,我已将Accept 和Content-Type 标头正确设置为application/json,但这还不够。

    解决方案

    我只是忘记了我的 DTO 对象没有参数的默认构造函数。是的,这与 @Entity 对象背后的原因相同,您需要一个不带参数的构造函数供 ORM 实例化对象并稍后填充字段。

    向我的 DTO 对象添加不带参数的构造函数解决了我的问题。 这是一个类似于我的代码的示例:

    错误

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class NumberDTO {
        public NumberDTO(Number number) {
            this.number = number;
        }
    
        private Number number;
    
        public Number getNumber() {
            return number;
        }
    
        public void setNumber(Number number) {
            this.number = number;
        }
    }
    

    正确

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class NumberDTO {
    
        public NumberDTO() {
        }
    
        public NumberDTO(Number number) {
            this.number = number;
        }
    
        private Number number;
    
        public Number getNumber() {
            return number;
        }
    
        public void setNumber(Number number) {
            this.number = number;
        }
    }
    

    我失去了几个小时,我希望这会节省你的时间 ;-)

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多