【问题标题】:Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')意外字符('a'(代码 97)):需要一个有效值(数字、字符串、数组、对象、'true'、'false' 或 'null')
【发布时间】:2016-02-11 10:06:15
【问题描述】:

我刚刚尝试调用index.jsp,它使用http POST 将json 发送到我的rest 项目。

但它抛出了这个错误:
我无法弄清楚问题出在哪里 任何提示?我不知道这个。

org.apache.catalina.core.StandardWrapperValve 调用 坟墓:servlet [jersey-serlvet] 在路径 [/HibernateTutorialWeb] 的上下文中的 Servlet.service() 引发异常 [org.codehaus.jackson.JsonParseException:意外字符('a'(代码 97)):预期有效值(数字、字符串、数组、对象、“真”、“假”或“空”) 在 [来源:org.apache.catalina.connector.CoyoteInputStream@24097548;行:1,列:2]] 有根本原因 org.codehaus.jackson.JsonParseException:意外字符('a'(代码 97)):预期有效值(数字、字符串、数组、对象、'true'、'false' 或 'null') 在 [来源:org.apache.catalina.connector.CoyoteInputStream@24097548;行:1,列:2] 在 org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1213) 在 org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:375) 在 org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:306) 在 org.codehaus.jackson.impl.Utf8StreamParser._handleUnexpectedValue(Utf8StreamParser.java:1536) 在 org.codehaus.jackson.impl.Utf8StreamParser._nextTokenNotInObject(Utf8StreamParser.java:432) 在 org.codehaus.jackson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:318) 在 org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2168) 在 org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2106) 在 org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1004) 在 org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410) 在 com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139) 在 com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474) 在 com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) 在 com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) 在 com.sun.jersey.server.impl.model.method.dispatch.Abs​​tractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) 在 com.sun.jersey.server.impl.model.method.dispatch.Abs​​tractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) 在 com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 在 com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 在 com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 在 com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 在 com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 在 com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Send jSon - put method</title>

    </head>
    <body>
    <script>
    //var people = {"address": "Address 12", "name": "twelve", "id": 12,"surname": "twelve"};
    var people={"address": "hello"};
    function sendobject(){
      $.ajax({
            type: "POST",
            url: "http://localhost:8080/HibernateTutorialWeb/rest/person/post",
            data: people,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert(data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
      });
    }
    </script>
        <input type="button" onclick="sendobject()" value="invia"> </input>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    </body>
</<html>

人员服务。爪哇

package com.ws.service;

import java.util.List;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

import com.dao.*;
import com.model.*;

@Path("/person")
public class PersonService {

    // try hello data
    // http://localhost:8080/HibernateTutorialWeb/rest/person/hello/mario
    @GET
    @Path("/hello/{param}")
    public Response getMsg(@PathParam("param") String msg) {

        String output = "Jersey say hello : " + msg;

        return Response.status(200).entity(output).build();
    }

    // http://localhost:8080/HibernateTutorialWeb/rest/person/2
    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Person getPersonById(@PathParam("id") int id) {
        return new PersonDao().getPersonById(id);
        // error for type of response incorrect
        /*
         * public ResponseBuilder getPersonById(@PathParam("id") int id){
         * PersonDao pDao = new PersonDao (); if(pDao.getPersonById(id) != null)
         * {return Response.status(200).entity(new
         * PersonDao().getPersonById(id));} else{ return
         * Response.status(200).entity("Utente id: "+ id + ", Rimosso"); }
         */
    }

    // //http://localhost:8080/HibernateTutorialWeb/rest/person/getAllJson
    @GET
    @Path("/getAllJson")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Person> getAllJson() {
        return new PersonDao().getAllPerson();
    }

    @GET
    @Path("/xml/{id}")
    @Produces(MediaType.APPLICATION_XML)
    public Person getPersonByIdXML(@PathParam("id") int id) {
        return new PersonDao().getPersonById(id);
    }

    @POST
    @Path("/post")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUtenteJSON(Person person) {
        new PersonDao().saveOrUpdate(person);
        String result = "Person saved : " + person;
        return Response.status(201).entity(result).build();
    }

    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response updateUtente(Person person) {
        if (person.getId() != 0) {
            new PersonDao().saveOrUpdate(person);
            return Response.ok(person, MediaType.APPLICATION_JSON).build();
        } else {
            return Response.status(Response.Status.BAD_REQUEST)
                    .entity("Specificare l'id dell'utente").build();
        }
    }

    @DELETE
    @Path("{id}")
    public Response removePerson(@PathParam("id") Integer id) {
        new PersonDao().deletePerson(id);
        return Response.status(200).entity("Utente id: " + id + ", Rimosso")
                .build();
    }

}

PersonDao.java

package com.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.model.Person;
import com.util.SessionFactoryUtil;

public class PersonDao {

    public void saveOrUpdate(Person person) {
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();

        try {
            trns = session.beginTransaction();
            if (person.getId() != 0) {
                //if exists update obj
                session.update(person);
            } else {
                session.save(person);
            }
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }

    public void deletePerson(int id) {
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            Person person = (Person) session.load(Person.class, new Integer(id));
            
            System.out.println("Deleted person :"+person.toString());
            
            session.delete(person);
            
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }

    }

    public List<Person> getAllPerson() {
        List<Person> people = new ArrayList<Person>();
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            people = session.createQuery("from Person").list();
            
            //session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
        } finally {
            session.flush();
            session.close();
        }
        System.out.println("People list : \n");
        for(int i=0;i<people.size();i++){
            System.out.println(people.get(i));
        }
        return people;
    }

    public Person getPersonById(int id) {
        Person person = null;
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            String queryString = "FROM Person WHERE id = :id";
            Query query = session.createQuery(queryString);
            query.setInteger("id", id);
            person = (Person) query.uniqueResult();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return person;
    }

}

更新: 在 index.jsp 上

var people = JSON.parse({"address": "Indirizzo 12", "name": "dodici", "id": 12,"surname": "dodici"});

现在的错误是这样的:

    HTTP Status 500 - java.io.EOFException: No content to map to Object due to end of input

type Exception report

message java.io.EOFException: No content to map to Object due to end of input

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.io.EOFException: No content to map to Object due to end of input
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.io.EOFException: No content to map to Object due to end of input
    org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2173)
    org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2106)
    org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1004)
    org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410)
    com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139)
    com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
    com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
    com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

【问题讨论】:

  • 哪行代码抛出错误?
  • @AbtPst 现在我添加了完整的错误!
  • 好的,你能看到你的java代码中的哪一行导致了异常吗?我似乎无法找到。基本上哪一行代码是你从 JSP 读取数据的地方?
  • 不是 JSON.parse 的副本,我也尝试过该帖子中的解决方案,但不起作用。 @JavaHD

标签: java json rest jsp servlets


【解决方案1】:

尝试将Object 更改为JSON 行:

var people={"address": "ciao"};

收件人:

var people=JSON.stringify(eval({"address": "ciao"}));

确保Person 类具有您传递给它的相同参数构造函数。


根据您在评论中的图像堆栈跟踪异常,错误发生在Hibernate 中,异常StaleStateException 表示:

版本号或时间戳检查失败时抛出,表示 会话包含陈旧数据(使用长事务时 带版本控制)。如果我们尝试删除或更新一行 不存在

  1. 这可以通过从数据库中更新对象来解决,例如休眠中的刷新方法,然后提交会将对象持久保存在数据库中。
  2. 您可以使用合并方法和提交,但在这里您将覆盖当前数据。
  3. 使用锁也可以解析改变状态。

【讨论】:

  • 查看我对帖子的更新评论:var people = JSON.parse({"address": "Indirizzo 12", "name": "dodici", "id": 12,"surname": "dodici"});
  • JSON.parse(你还在传递对象)不像JSON.stringify(会发送json格式)它是不同的
【解决方案2】:

错误消息是服务器收到的 POST 输入不是有效的 JSON。

JQuery 可能从此输入中产生的结果:var people={"address": "ciao"}; 不是您所期望的。您可以尝试嗅探通过 HTTP 请求实际传输的内容(使用 Firebug、Wireshark 等)。


尝试使用:

var people='{"address": "ciao"}';

而不是

var people={"address": "ciao"};

【讨论】:

  • 我已经尝试过您的解决方案@Jiri Tousek,但它不起作用
【解决方案3】:

由我解决,

我的 jsp 出现错误。 我正在检查它是否是来自 id 的新用户。

后台

if (person.getId() != 0) {
     //if exists update obj
     session.update(person);
} else {
     session.save(person);
}

jsp:

var people = JSON.stringify
(eval({"address": "Indirizzo 12", "name": "twelve", "id": 12, "surname": "twelve"}));

因此,使用Id,dao 尝试更新 db 上不存在的记录,这就是错误的原因。

现在你是我在 jsp 中的 people var:

var people = 
JSON.stringify(eval({"address": "Indirizzo 12", "name": "twelve","surname": "twelve"}));

效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多