发布restful方法java错误

时间:2017-02-20 13:54:24

标签: javascript java jquery web-services rest

有谁能告诉我为什么会出现这个错误?

服务器日志:

 StandardWrapperValve[ws_site.ApplicationConfig]: Servlet.service() for servlet ws_site.ApplicationConfig threw exception
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 5
at com.google.gson.stream.JsonReader.expect(JsonReader.java:339)
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
    at com.google.gson.Gson.fromJson(Gson.java:791)

Javascript函数,负责捕获填充表单的数据并发送到服务器:

function save()
{

    var str_name = $("#name").val();
    var str_email = $("#email").val();


    var str_country = $("#country").val();
    var str_state = $("#state").val();
    var str_city = $("#city").val();
    var str_zipcode = $("#zipcode").val();
    var str_neighborhood = $("#neighborhood").val();
    var str_street = $("#street").val();
    var str_number = $("#number").val();


    var objdata = '{"email_user":"' + str_email + '","name_user":"' + str_name}';
var objlocation = '{"country":"' + str_country + '","state":"' + str_state + '","city":"' + str_city + '","neighborhood":"' + str_neighborhood + '","street":"' + str_street + '","number":"' + str_number + '","zipcode":"' + str_zipcode + '"}';

    var obj = '{"user":['+objdata+'],"endereco":['+objlocation+']}';

    $.ajax({
        headers: {'content-type': 'application/json'},
        dataType: 'json',
        method: "POST",
        url: "http://localhost:8080/SystemExample/webservice/Save/data",
        data: obj
     }).done(function (data)
     {
        alert(data);
     });
}

Restful Java方法:

@POST
@Path("data")
@Produces(MediaType.TEXT_PLAIN)
@Consumes({MediaType.APPLICATION_JSON})
public String registerUser(Gson json)  
{
    User u = json.fromJson("user", User.class);
    Address a = json.fromJson("endereco", Address.class);
    u.setAddress(a);
    userDAO.save(u);
    return "Saved successfully!";
}

保存userDAO方法:

    public void save(User u) {
    EntityManager em = JPAUtil.getEntityManager();
    EntityTransaction tx = em.getTransaction();

    try {
        tx.begin();
        if (u.getId_User() == null) {

            em.persist(u);
        } else {
            em.merge(u);
        }
        tx.commit();
    } catch (Exception ex) {
        ex.printStackTrace();
        if (tx != null && tx.isActive()) {
            tx.rollback();
        }
    } finally {
        em.close();
    }
}

使用Gson将json转换为对象

3 个答案:

答案 0 :(得分:2)

你没有向服务器发送一个对象,你只是发送一个字符串:

var obj = '...';

相反,发送一个对象:

var objdata = {
  "email_user": str_email,
  "name_user": str_name
};
var objlocation = {
  "country": str_country,
  "state": str_state,
  "city": str_city,
  "neighborhood": str_neighborhood,
  "street": str_street,
  "number": str_number,
  "zipcode": str_zipcode
};

var obj = {
  "user": [objdata],
  "endereco": [objlocation]
};

看起来像对象的字符串仍然是字符串。

答案 1 :(得分:1)

objdata没有正确填充为有效的json。试试这个:

    function save() {
        var str_name = $("#name").val();
        var str_email = $("#email").val();
        var str_country = $("#country").val();
        var str_state = $("#state").val();
        var str_city = $("#city").val();
        var str_zipcode = $("#zipcode").val();
        var str_neighborhood = $("#neighborhood").val();
        var str_street = $("#street").val();
        var str_number = $("#number").val();

        var objdata = '{"email_user":"' + str_email + '","name_user":"' + str_name + '"}';
        console.log(objdata);

        var objlocation = '{"country":"' + str_country + '","state":"' + str_state + '","city":"' + str_city + '","neighborhood":"' + str_neighborhood + '","street":"' + str_street + '","number":"' + str_number + '","zipcode":"' + str_zipcode + '"}';
        console.log(objlocation);

        var obj = '{"user":[' + objdata + '],"endereco":[' + objlocation + ']}';
        console.log(obj);

        $.ajax({
            headers: {'content-type': 'application/json'},
            dataType: 'json',
            method: "POST",
            url: "http://localhost:8080/SystemExample/webservice/Save/data",
            data: JSON.parse(obj)
        }).done(function (data) {
            alert(data);
        });
    }

答案 2 :(得分:0)

在服务器端,您正在尝试绑定JSON数据。

User u = json.fromJson("user", User.class);
Address a = json.fromJson("endereco", Address.class);

表示userendereco应该是JSON对象,如下所示。

{
    "user":{
        "email_user":"str_mail","name_user":"nameeee"
    },
    "endereco":{
        "country":"str_country","state":"str_state","city":"str_city","neighborhood":"str_neighborhood","street":"str_street","number":"str_number","zipcode":"str_zipcode"
    }
}

但在你的情况下,userendereco实际上是一个JSONArray(见方括号)。

{
    "user":[
        {
            "email_user":"str_mail",
            "name_user":"nameeee"
        }
    ],
    "endereco":[
        {
            "country":"str_country",
            "state":"str_state",
            "city":"str_city",
            "neighborhood":"str_neighborhood",
            "street":"str_street",
            "number":"str_number",
            "zipcode":"str_zipcode"
        }
    ]
}

因此改变行

var obj = '{"user":['+objdata+'],"endereco":['+objlocation+']}';

var obj = '{"user":'+objdata+',"endereco":'+objlocation+'}';