2017-02-20 96 views
0

誰能告訴我爲什麼這個錯誤?帖子寧靜的方法java錯誤

服務器日誌:

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); 
    }); 
} 

寧靜的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轉換成一個對象

+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] 
}; 

看起來像的字符串仍然是一個字符串。

+0

是的:更清潔 –

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); 
     }); 
    } 
+0

由於dataType明確指定爲json,因此不需要JSON.parse()。 –

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+'}'; 
+0

我照你告訴我的那樣出現了:重墳:行1:0在字符'u'沒有可行的選擇墳墓:行1:1沒有可行的替代人物的'墓':行1: 2在字符'e'沒有可行的替代方案墓地:第1行:3字符'r'沒有可行的替代墓地:第1行:4字符'%'沒有可行的替代方案我只放入一片。但僅此而已。 –

+0

@DeividSantosAlves不確定你在說什麼 –