如何在没有 servlet 但使用 JAX-RS 的情况下 post json 从 ajax 到 java class 的对象?
How to post json object from ajax to java class without without servlet but with JAX-RS?
我是 JAX-RS
的新手,我正在努力学习有关它的新知识。我遇到一个问题,即在 Java Script
中创建一个 JSON
对象,然后使用 JAX-RS
通过 ajax
将其发布到 Java
class 并且annotations
并从中创建一个 JSON
文件。我正在为其创建一个 Maven
项目。任何人都可以为此建议我任何教程。我试图从过去 1 周开始实施它,但无能为力。
任何建议表示赞赏。
我在 Java
中的 POST annotation
是:
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void post(Message obj){
System.out.println("in post");
String v_id = obj.getID();
String v_email = obj.getEmail();
String v_checkedornot = obj.getCheckedOrNot();
System.out.println("id " + v_id +" email " + v_email + " checkedornot " + v_checkedornot);
}
而我的 AJAX
POST
是:
var passingObject = {
ID : '123456',
userEmail : 'a.a@a',
ApproverFlag : 'true'
}
var passobj = JSON.stringify(passingObject);
$.ajax({
url: './webapi/messages/post',
type: 'POST',
contentType:"application/json",
data: passobj,
dataType:'json',
success:function(data){
alert(JSON.stringify(data));
}
},'json');
只需将 Java 脚本对象映射到 Java 对象。这是基本映射。很简单。
Java脚本对象映射到Java对象(或POJO)
var obj = {};
public class MyObject {}
Java脚本属性映射到 Java fields/properties
var obj = {
firstName: "Tejas",
lastName: "Saitwal"
}
public class MyObject {
private String firstName;
private String lastName;
// getters-setters
}
Java脚本数组映射到 Java List
或 Java 数组。
var obj = {
firstName: "Tejas",
lastName: "Saitwal",
hobbies: ["dancing", "singing"]
}
public class MyObject {
private String firstName;
private String lastName;
private List<String> hobbies;
// getters-setters
}
Java脚本嵌套对象映射到 Java 嵌套对象
var obj = {
firstName: "Tejas",
lastName: "Saitwal",
hobbies: ["dancing", "singing"],
address: {
street: "1234 main st",
city: "NYC"
}
}
public class MyObject {
private String firstName;
private String lastName;
private List<String> hobbies;
private Address address;
// getters-setters
}
public class Address {
private String street;
private String city;
}
Java脚本对象列表映射到 Java List<Type>
或 Type[]
var obj = {
firstName: "Tejas",
lastName: "Saitwal",
hobbies: ["dancing", "singing"],
address: {
street: "1234 main st",
city: "NYC"
},
friends: [
{ name: "friend1", phone: "123456578" },
{ name: "friend2", phone: "123454567" }
]
}
public class MyObject {
private String firstName;
private String lastName;
private List<String> hobbies;
private Address address;
private List<Friend> friends;
// getters-setters
}
public class Address {
private String street;
private String city;
}
public class Friend {
private String name;
private String phone;
}
现在您有一个 Java class (MyObject
) 可以与 Javascript 对象完全映射。因此,您可以将 MyObject
作为方法参数。
@POST
@Consumes("application/json")
public Response post(MyObject obj) {}
$.ajax({
url: url,
contentType: "application/json",
data: JSON.stringify(obj)
});
这还不是全部。您需要一个知道如何将 JSON 反序列化到您的 POJO 中的提供程序(或 MessageBodyReader
)。为此,杰克逊是我的首选方式。只需添加此 Maven 依赖项
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.6.0</version>
</dependency>
然后您需要在您的应用程序中注册 JacksonJsonProvider
。有很多方法可以做到这一点,但在不知道您使用的 JAX-RS 实现和版本的情况下,我将不得不列出所有不同的方法。因此,如果您不确定如何注册它,请告诉我您正在使用的 JAX-RS 实现、实现的版本,并说明您当前如何配置应用程序(即 web.xml 或 Java 配置).
另请参阅:
您必须将 contentType 设置为 JSON 并且在服务端您需要像下面这样注释方法
@Produces(MediaType.APPLICATION_JSON) // produces JSON object as response
@Consumes(MediaType.APPLICATION_JSON)
我是 JAX-RS
的新手,我正在努力学习有关它的新知识。我遇到一个问题,即在 Java Script
中创建一个 JSON
对象,然后使用 JAX-RS
通过 ajax
将其发布到 Java
class 并且annotations
并从中创建一个 JSON
文件。我正在为其创建一个 Maven
项目。任何人都可以为此建议我任何教程。我试图从过去 1 周开始实施它,但无能为力。
任何建议表示赞赏。
我在 Java
中的 POST annotation
是:
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void post(Message obj){
System.out.println("in post");
String v_id = obj.getID();
String v_email = obj.getEmail();
String v_checkedornot = obj.getCheckedOrNot();
System.out.println("id " + v_id +" email " + v_email + " checkedornot " + v_checkedornot);
}
而我的 AJAX
POST
是:
var passingObject = {
ID : '123456',
userEmail : 'a.a@a',
ApproverFlag : 'true'
}
var passobj = JSON.stringify(passingObject);
$.ajax({
url: './webapi/messages/post',
type: 'POST',
contentType:"application/json",
data: passobj,
dataType:'json',
success:function(data){
alert(JSON.stringify(data));
}
},'json');
只需将 Java 脚本对象映射到 Java 对象。这是基本映射。很简单。
Java脚本对象映射到Java对象(或POJO)
var obj = {};
public class MyObject {}
Java脚本属性映射到 Java fields/properties
var obj = {
firstName: "Tejas",
lastName: "Saitwal"
}
public class MyObject {
private String firstName;
private String lastName;
// getters-setters
}
Java脚本数组映射到 Java List
或 Java 数组。
var obj = {
firstName: "Tejas",
lastName: "Saitwal",
hobbies: ["dancing", "singing"]
}
public class MyObject {
private String firstName;
private String lastName;
private List<String> hobbies;
// getters-setters
}
Java脚本嵌套对象映射到 Java 嵌套对象
var obj = {
firstName: "Tejas",
lastName: "Saitwal",
hobbies: ["dancing", "singing"],
address: {
street: "1234 main st",
city: "NYC"
}
}
public class MyObject {
private String firstName;
private String lastName;
private List<String> hobbies;
private Address address;
// getters-setters
}
public class Address {
private String street;
private String city;
}
Java脚本对象列表映射到 Java List<Type>
或 Type[]
var obj = {
firstName: "Tejas",
lastName: "Saitwal",
hobbies: ["dancing", "singing"],
address: {
street: "1234 main st",
city: "NYC"
},
friends: [
{ name: "friend1", phone: "123456578" },
{ name: "friend2", phone: "123454567" }
]
}
public class MyObject {
private String firstName;
private String lastName;
private List<String> hobbies;
private Address address;
private List<Friend> friends;
// getters-setters
}
public class Address {
private String street;
private String city;
}
public class Friend {
private String name;
private String phone;
}
现在您有一个 Java class (MyObject
) 可以与 Javascript 对象完全映射。因此,您可以将 MyObject
作为方法参数。
@POST
@Consumes("application/json")
public Response post(MyObject obj) {}
$.ajax({
url: url,
contentType: "application/json",
data: JSON.stringify(obj)
});
这还不是全部。您需要一个知道如何将 JSON 反序列化到您的 POJO 中的提供程序(或 MessageBodyReader
)。为此,杰克逊是我的首选方式。只需添加此 Maven 依赖项
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.6.0</version>
</dependency>
然后您需要在您的应用程序中注册 JacksonJsonProvider
。有很多方法可以做到这一点,但在不知道您使用的 JAX-RS 实现和版本的情况下,我将不得不列出所有不同的方法。因此,如果您不确定如何注册它,请告诉我您正在使用的 JAX-RS 实现、实现的版本,并说明您当前如何配置应用程序(即 web.xml 或 Java 配置).
另请参阅:
您必须将 contentType 设置为 JSON 并且在服务端您需要像下面这样注释方法
@Produces(MediaType.APPLICATION_JSON) // produces JSON object as response
@Consumes(MediaType.APPLICATION_JSON)