如何在没有 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)