HTTP 415 不支持的媒体类型

HTTP 415 Unsupported Media Type

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

我正在使用 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

但我仍然有问题。

我删除了 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>

我遇到了类似的问题,可能是您忘记了 Patient class.

的默认 no-parameters 构造函数

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

如其他回复中所述,我已将 AcceptContent-Type headers 正确设置为 application/json,但这还不够。

解决方案

我只是忘记了我的 DTO objects 没有参数的默认构造函数。是的,这与@Entity objects 背后的推理相同,您需要一个没有参数的构造函数,以便 ORM 实例化 objects 并稍后填充字段。

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

错误

@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;
    }
}

我浪费了时间,我希望这会节省你的时间;-)