【问题标题】:Post restful method java error发布restful方法java错误
【发布时间】:2023-03-09 16:33:01
【问题描述】:

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

服务器日志:

 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转成对象

【问题讨论】:

  • 您的堆栈跟踪似乎有点短,没有更多行了吗?

标签: javascript java jquery web-services rest


【解决方案1】:

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

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

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

【讨论】:

  • 是的:更干净
【解决方案2】:

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

【讨论】:

  • 不需要 JSON.parse(),因为 dataType 明确指定为 json。
【解决方案3】:

在您的服务器端,您正在尝试绑定 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+'}';

【讨论】:

  • 我按照你告诉我的做了,它出现了:Grave: line 1:0 在角色'u' Grave: line 1:1 no可行的选择在角色's' Grave: line 1:2 在字符 'e' 处没有可行的选择 Grave:行 1:3 在字符 'r' 处没有可行的选择 Grave:行 1:4 在字符 '%' 处没有可行的选择 我只放入了一个切片。但仅此而已。
  • @DeividSantosAlves 不知道你想说什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2014-02-28
相关资源
最近更新 更多