Java 意外字符('a'(代码 97)):应为有效值(数字、字符串、数组、对象、'true'、'false' 或 'null')
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33631523/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
提问by Dwhitz
I've just tried to calling index.jsp
which sends a json to my rest project with http POST.
我刚刚尝试调用index.jsp
它使用 http POST 将 json 发送到我的其余项目。
But it throws me this error:
I can't figure out where is the issue
Any tip? I haven't idea for this.
但这给我带来了这个错误:
我不知道问题出在哪里任何提示?我没有这个想法。
nov 10, 2015 2:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet [jersey-serlvet] in context with path [/HibernateTutorialWeb] threw exception [org.codehaus.Hymanson.JsonParseException: Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: org.apache.catalina.connector.CoyoteInputStream@24097548; line: 1, column: 2]] with root cause org.codehaus.Hymanson.JsonParseException: Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: org.apache.catalina.connector.CoyoteInputStream@24097548; line: 1, column: 2] at org.codehaus.Hymanson.JsonParser._constructError(JsonParser.java:1213) at org.codehaus.Hymanson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:375) at org.codehaus.Hymanson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:306) at org.codehaus.Hymanson.impl.Utf8StreamParser._handleUnexpectedValue(Utf8StreamParser.java:1536) at org.codehaus.Hymanson.impl.Utf8StreamParser._nextTokenNotInObject(Utf8StreamParser.java:432) at org.codehaus.Hymanson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:318) at org.codehaus.Hymanson.map.ObjectMapper._initForReading(ObjectMapper.java:2168) at org.codehaus.Hymanson.map.ObjectMapper._readValue(ObjectMapper.java:2106) at org.codehaus.Hymanson.map.ObjectMapper.readValue(ObjectMapper.java:1004) at org.codehaus.Hymanson.jaxrs.HymansonJsonProvider.readFrom(HymansonJsonProvider.java:410) at com.sun.jersey.json.impl.provider.entity.HymansonProviderProxy.readFrom(HymansonProviderProxy.java:139) at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474) at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)
2015 年 11 月 10 日下午 2:30:37 org.apache.catalina.core.StandardWrapperValve 调用 GRAVE:Servlet [jersey-serlvet] 的 Servlet.service() 在路径 [/HibernateTutorialWeb] 的上下文中抛出异常 [org.codehaus.Hymanson .JsonParseException: Unexpected character ('a' (code 97)): 在 [Source: org.apache.catalina. connector.CoyoteInputStream@24097548; line: 1, column: 2]] 与根本原因 org.codehaus.Hymanson.JsonParseException: Unexpected character ('a' (code 97)): 期望一个有效值(数字,字符串,数组,对象,'真',' false' 或 'null') 在 [来源:org.apache.catalina.connector.CoyoteInputStream@24097548; 行:1,列:2] 在 org.codehaus.Hymanson.JsonParser。
index.jsp:
索引.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>
PersonService . java
人员服务。爪哇
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;
}
}
Updated :on index.jsp
更新:在 index.jsp 上
var people = JSON.parse({"address": "Indirizzo 12", "name": "dodici", "id": 12,"surname": "dodici"});
Now the error is this :
现在错误是这样的:
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.Hymanson.map.ObjectMapper._initForReading(ObjectMapper.java:2173)
org.codehaus.Hymanson.map.ObjectMapper._readValue(ObjectMapper.java:2106)
org.codehaus.Hymanson.map.ObjectMapper.readValue(ObjectMapper.java:1004)
org.codehaus.Hymanson.jaxrs.HymansonJsonProvider.readFrom(HymansonJsonProvider.java:410)
com.sun.jersey.json.impl.provider.entity.HymansonProviderProxy.readFrom(HymansonProviderProxy.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)
采纳答案by Dwhitz
Solved by me,
由我解决,
There was an error on my jsp. I was checking if it's a new user from the id.
我的jsp有错误。我正在检查它是否是来自 id 的新用户。
Backend
后端
if (person.getId() != 0) {
//if exists update obj
session.update(person);
} else {
session.save(person);
}
Jsp:
jsp:
var people = JSON.stringify
(eval({"address": "Indirizzo 12", "name": "twelve", "id": 12, "surname": "twelve"}));
So with the Id
, the dao try to update a record inexistent on db, and this is the cause of the error.
因此Id
,使用 dao 尝试更新 db 上不存在的记录,这就是错误的原因。
Now thy is my people
var in jsp :
现在你是我people
在 jsp 中的变量:
var people =
JSON.stringify(eval({"address": "Indirizzo 12", "name": "twelve","surname": "twelve"}));
It works good.
它运作良好。
回答by Jiri Tousek
What the error message says is that the POST input the server received was not a valid JSON.
错误消息表明服务器收到的 POST 输入不是有效的 JSON。
Probably what JQuery produces out of this input: var people={"address": "ciao"};
isn't what you expect. You can try sniffing what was actually transmitted over the HTTP request (using Firebug, Wireshark etc.).
可能 JQuery 从这个输入中产生的东西:var people={"address": "ciao"};
不是你所期望的。您可以尝试嗅探通过 HTTP 请求实际传输的内容(使用 Firebug、Wireshark 等)。
Try using:
尝试使用:
var people='{"address": "ciao"}';
instead of
代替
var people={"address": "ciao"};
回答by Husam
Try to change the Object
to JSON
line:
尝试更改Object
toJSON
行:
var people={"address": "ciao"};
To:
到:
var people=JSON.stringify(eval({"address": "ciao"}));
Make sure that Person
class has the same param constructor you passing to it.
确保Person
该类具有您传递给它的相同参数构造函数。
According to your image stack trace exception in the comment, The error occurs in the Hibernate
with Exception StaleStateExceptionwhich means:
根据您在注释中的图像堆栈跟踪异常,该错误发生在Hibernate
with Exception StaleStateException 中,这意味着:
Thrown when a version number or timestamp check failed, indicating that the Session contained stale data (when using long transactions with versioning). Also occurs if we try delete or update a row that does not exist
当版本号或时间戳检查失败时抛出,表明 Session 包含陈旧数据(当使用带有版本控制的长事务时)。如果我们尝试删除或更新不存在的行,也会发生
- This can be resolved by updating the object from database like refresh method in hibernate and then commit will persist the object in databse.
- You can use merge method and commit, but here you will override the current data.
- Using lock can also be resolved to change the state.
- 这可以通过从数据库更新对象来解决,例如休眠中的刷新方法,然后提交将对象持久化到数据库中。
- 您可以使用合并方法和提交,但在这里您将覆盖当前数据。
- 使用锁也可以解决改变状态。