java - 在 java Rest API 中使用 json POST 请求的问题

标签 java json rest jax-rs

我知道这个问题已被问过多次,但即使在完成了这些答案中提供的所有操作后,我仍然陷入困境。我是 java EE 的新手,在使用 Spring 框架之前我希望有一个坚实的基础。所以我的问题是我无法接受/处理发送到简单 Java Rest API 的 json 请求。我有一个调用 java Rest API 的前端网页。但即使通过“PostMan”我也遇到了同样的错误

"HTTP Status 415 – Unsupported Media Type"

我有一个带有两种方法的简单 Controller 类。接受 String 的 Get 方法工作正常。但问题出在 Post 方法上。我的 header 值为 "content-type:application/json"。但问题仍然相同 我只是想了解一些事情。我有一个 java 类,其字段名称与 json 请求完全相同。但我的理解是 @Consumes(MediaType.APPLICATION_JSON) 注释足以让 Jax RS 解析对 java 对象的 json 请求。或者我需要在我的类(class)级别上有任何其他注释吗?这是我的整个项目。 我也不确定我在 pom.xml 中定义的依赖项。

如果有帮助,我们将不胜感激。提前致谢。

pom.xml

<小时/>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.thomsoncodes</groupId>
<artifactId>demobank</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>demobank</name>

<build>
    <finalName>demobank</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
        <!-- artifactId>jersey-container-servlet</artifactId -->
    </dependency>
    <!-- uncomment this to get JSON support
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
    </dependency>
    -->
</dependencies>
<properties>
    <jersey.version>2.16</jersey.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

我的 Controller 类

<小时/>
@Path("/customerinfo")
public class CustomerInfoController {

  @POST
  @Path("/greeting")
  @Consumes(MediaType.TEXT_PLAIN)
  @Produces(MediaType.TEXT_PLAIN)
  public String greetings(String message) {
      return "Hello " + message;
  }

  @POST
  @Path("/newcustomer")
  @Consumes(MediaType.APPLICATION_JSON)
  @Produces(MediaType.APPLICATION_JSON)
  public Response createNewCustomer(Customer customer) {        
      String result = "New customer is created : " + customer;
      return Response.status(201).entity(result).build();

  }


}

我的对象类

<小时/>
public class Customer {
   private String firstName;
   private String midName;
   private String lastName;
   private String citizenship;
   private String dob;
   private String ssn;
   private String city;
   private String state;
   private String country;
   private String email;
   private String phone;


   public String getFirstName() {
       return firstName;
   }
   public void setFirstName(String firstName) {
       this.firstName = firstName;
   }
   public String getMidName() {
       return midName;
   }
   public void setMidName(String midName) {
       this.midName = midName;
   }
   public String getLastName() {
       return lastName;
   }
   public void setLastName(String lastName) {
       this.lastName = lastName;
   }
   public String getCitizenship() {
       return citizenship;
   }
   public void setCitizenship(String citizenship) {
       this.citizenship = citizenship;
   }
   public String getDob() {
       return dob;
   }
   public void setDob(String dob) {
       this.dob = dob;
   }
   public String getSsn() {
       return ssn;
   }
   public void setSsn(String ssn) {
       this.ssn = ssn;
   }
   public String getCity() {
       return city;
   }
   public void setCity(String city) {
       this.city = city;
   }
   public String getState() {
       return state;
   }
   public void setState(String state) {
       this.state = state;
   }
   public String getCountry() {
       return country;
   }
   public void setCountry(String country) {
       this.country = country;
   }
   public String getEmail() {
       return email;
   }
   public void setEmail(String email) {
       this.email = email;
   }
   public String getPhone() {
       return phone;
   }
   public void setPhone(String phone) {
       this.phone = phone;
   }



 }

这是 Postman 请求正文

<小时/>
Method - POST
Header - content-type:application/json
Body - {
      "firstName" : "John",
      "midName" : "Null",
      "lastName" : "Doe",
      "citizenship" : "USA",
      "dob" : "MM/DD/YYYY",
      "ssn" : "1868138163",
      "city" : "City",
      "state" : "State","country" : "USA",
      "email":"email@example.com",
      "phone" : "1234567890"

    }

最佳答案

But my understanding is @Consumes(MediaType.APPLICATION_JSON) annotation is enough for Jax RS to parse the json request to java object

没有。它不是这么做的。其目的是用于内容协商,如 this post 中所述。 .

实际上,(反)序列化是 Entity provider (或 MessageBodyReader/Wrider)。如果找不到处理转换的提供者,您将收到 415 错误。在您的例子中,您使用的 JSON 提供程序是 MOXy,您可以在依赖项中看到它

<!-- uncomment this to get JSON support
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>
-->

MOXy 的特点是它构建在 JAXB 之上,因此,它需要使用相同的注释。对于 JAXB,我们需要使用 @XmlRootElement 来注释我们的模型。因此,如果您将其添加到模型类中,它应该可以工作。

如果您不想使用注释,您可以使用 Jackson 而不是 MOXy,无论如何我都会推荐 MOXy。只需将上面的artifactId更改为jersey-media-json-jackson

关于java - 在 java Rest API 中使用 json POST 请求的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51238081/

相关文章:

java - While 循环并检查静态变量

java - 如何在其他按钮上单击不可见按钮

java - 在 Eclipse AVD 中,我得到了 'Unfortunately ~ has stopped working'

java - pop()ing 堆栈似乎并没有删除这些值

json - 如何让 Angular 的 HttpClient 返回一个对象而不是字符串?

MySQL json 错误 rails_workflow gem

php - 在 php 中像字符串一样解码 json

rest - ArangoDB Foxx 作为 REST 后端

Rest API,在参数中使用 '/'

.net - Azure App Insights 中的 Rest API(后期)可用性测试