gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:03:19 25 4
gpt4 key购买 nike

我知道这个问题已被问过多次,但即使在完成了这些答案中提供的所有操作后,我仍然陷入困境。我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com