求助!Spring MVC使用@RequestBody 接收带空格的字符串,报错

JeffYL 2015-08-06 01:36:14
实体类:
public class TestVO {
private String CreateDate;
public String getCreateDate() {
return CreateDate;
}

public void setCreateDate(String createDate) {
CreateDate = createDate;
}
}

Controller:

@RequestMapping(value="/test2/", headers="Accept=application/json")
@ResponseBody
public TestVO test2(@RequestBody TestVO user) {

return user;
}


使用CURL发送请求:
curl -H "Content-Type: application/json" -d {\"createDate\":\"2015-07-31 00:00:00\"} --request POST http://localhost:8081/HQ520/test2/
报的错误:
八月 05, 2015 1:46:35 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [rest] in context with path [/HQ520] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unexpected end-of-input in VALUE_STRING
at [Source: org.apache.catalina.connector.CoyoteInputStream@2e330425; line: 1, column: 91]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected end-of-input in VALUE_STRING
at [Source: org.apache.catalina.connector.CoyoteInputStream@2e330425; line: 1, column: 91]] with root cause
com.fasterxml.jackson.core.JsonParseException: Unexpected end-of-input in VALUE_STRING
at [Source: org.apache.catalina.connector.CoyoteInputStream@2e330425; line: 1, column: 91]]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1274)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:588)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportInvalidEOF(ParserMinimalBase.java:521)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportInvalidEOF(ParserMinimalBase.java:515)
at com.fasterxml.jackson.core.base.ParserBase.loadMoreGuaranteed(ParserBase.java:426)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:1930)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString(UTF8StreamJsonParser.java:1911)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:276)
at com.fasterxml.jackson.databind.deser.std.JdkDeserializers$StringDeserializer.deserialize(JdkDeserializers.java:72)
at com.fasterxml.jackson.databind.deser.std.JdkDeserializers$StringDeserializer.deserialize(JdkDeserializers.java:59)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:338)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:89)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:290)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:112)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2563)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1865)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:138)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:183)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:98)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

我认为应该是MappingJacksonHttpMessageConverter解析JSON字符串的时候,无法区分字符串里面的空格。
有哪位大神遇到过类型的问题?怎么解决的?请指教。谢谢!
...全文
1484 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
页面测试下你的controller方法,

$.ajax({
  url:'',
  type:'post',
  dataType:'json',
  contentType:'application/json;charset=UTF-8'.
  data:JSON.stringify({参数1:值,参数2:值})
})
根据你的代码,参数1,参数2 都应该是TestVO里面的2个属性,且该属性有标准的set/get方法,然后在你的方法里打断点,看参数是否到位就知道怎么做了。
阿花大叔 2015-08-18
  • 打赏
  • 举报
回复
import java.util.Date;

import com.google.gson.Gson;

public class test1
{

public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
Dat obj = gson.fromJson("{'date' : '2010-1-2 12:00:00'}",Dat.class);// JSONObject.parseObject("{'date' : '2010-1-2 12:00:00'}", Dat.class);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(obj.getDate()));
}
}

class Dat
{
private Date date;

public Date getDate()
{
return date;
}

public void setDate(Date date)
{
this.date = date;
}
}
这个需要将时间格式转换一下
阿花大叔 2015-08-18
  • 打赏
  • 举报
回复
import com.google.gson.Gson;

public class test1
{

public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
Dat obj = gson.fromJson("{'date' : '2010-1-2 12:00:00'}",Dat.class);// JSONObject.parseObject("{'date' : '2010-1-2 12:00:00'}", Dat.class);
System.out.println(obj.getDate());
}
}

class Dat
{
private String date;

public String getDate()
{
return date;
}

public void setDate(String date)
{
this.date = date;
}
}
试一下这个,我试的结果是好的。
uFreeWo 2015-08-18
  • 打赏
  • 举报
回复
传参的时候,能urlencode 一下么~!~!
  • 打赏
  • 举报
回复
没必要那么麻烦啊,你如果只是取json参数,就按字符串的方式取就是
scmod 2015-08-17
  • 打赏
  • 举报
回复
引用 12 楼 spapple 的回复:
[quote=引用 10 楼 scmod 的回复:] 我不管有没有空格怎么都出不来...

@InitBinder
	public void init(WebDataBinder binder) {
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
			public void setAsText(String value) {
		        try {
		            setValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value));
		        } catch(ParseException e) {
		            setValue(null);
		        }
		    }

		    public String getAsText() {
		        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) getValue());
		    }        
		});
	}
这个可以,放在要用的controller里面就行了 全局的话放在@ControllerAdvice注解的类里
你这个方法用了,还是不行。很奇怪。[/quote] e_e那就不知道了... 按理空格这个一直没什么影响的,要不加个下划线替换空格吧
JeffYL 2015-08-17
  • 打赏
  • 举报
回复
引用 10 楼 scmod 的回复:
我不管有没有空格怎么都出不来...

@InitBinder
	public void init(WebDataBinder binder) {
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
			public void setAsText(String value) {
		        try {
		            setValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value));
		        } catch(ParseException e) {
		            setValue(null);
		        }
		    }

		    public String getAsText() {
		        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) getValue());
		    }        
		});
	}
这个可以,放在要用的controller里面就行了 全局的话放在@ControllerAdvice注解的类里
你这个方法用了,还是不行。很奇怪。
幻梦天使 2015-08-08
  • 打赏
  • 举报
回复
时间转string出错了
scmod 2015-08-07
  • 打赏
  • 举报
回复
我不管有没有空格怎么都出不来...

@InitBinder
	public void init(WebDataBinder binder) {
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
			public void setAsText(String value) {
		        try {
		            setValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value));
		        } catch(ParseException e) {
		            setValue(null);
		        }
		    }

		    public String getAsText() {
		        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) getValue());
		    }        
		});
	}
这个可以,放在要用的controller里面就行了 全局的话放在@ControllerAdvice注解的类里
Giberson1 2015-08-06
  • 打赏
  • 举报
回复
一种投机取巧的办法: 前台传
createDate=2015-07-31$00:00:00
后台对$进行处理,替换成空格
createDate=2015-07-31 00:00:00
scmod 2015-08-06
  • 打赏
  • 举报
回复
unclosed string : 好像是说没闭合的json字符串... 这是为啥...我测试都好好的...难道空格传输时候做了什么转义什么的...
JeffYL 2015-08-06
  • 打赏
  • 举报
回复
引用 6 楼 scmod 的回复:
[quote=引用 5 楼 spapple 的回复:] [quote=引用 4 楼 scmod 的回复:] 哦..那可能是用的json工具不一样... 我用fastjson

public class Demo {

	public static void main(String[] args) throws Exception {
		Dat obj = JSONObject.parseObject("{'date' : '2010-1-2 12:00:00'}", Dat.class);
		System.out.println(obj.getDate());
	}

}

class Dat {
	
	private Date date;

	public Date getDate() {
		return date;
	}
	
	public void setDate(Date date) {
		this.date = date;
	}
	
}
没报错,按理空格不应该会导致错误
嗯,我也是这样认为,应该是SpingMVC自带的JSON转换工具不支持带空格的字符串。[/quote] 好像可以配置下让他用我们选的json工具[/quote] 我试了fastjson,还是报错。 八月 06, 2015 6:06:38 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet [rest] in context with path [/HQ520] threw exception [Request processing failed; nested exception is com.alibaba.fastjson.JSONException: unclosed string : ] with root cause com.alibaba.fastjson.JSONException: unclosed string : at com.alibaba.fastjson.parser.JSONLexerBase.scanString(JSONLexerBase.java:901) at com.alibaba.fastjson.parser.JSONLexerBase.nextToken(JSONLexerBase.java:119) at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithChar(JSONLexerBase.java:381) at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithColon(JSONLexerBase.java:507) at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseField(ASMJavaBeanDeserializer.java:73) at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer$InnerJavaBeanDeserializer.parseField(ASMJavaBeanDeserializer.java:86) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:330) at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseRest(ASMJavaBeanDeserializer.java:100) at Fastjson_ASM_UserVO_1.deserialze(Unknown Source) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:551) at com.alibaba.fastjson.JSON.parseObject(JSON.java:293) at com.alibaba.fastjson.JSON.parseObject(JSON.java:278) at com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter.readInternal(FastJsonHttpMessageConverter.java:73)
scmod 2015-08-06
  • 打赏
  • 举报
回复
引用 5 楼 spapple 的回复:
[quote=引用 4 楼 scmod 的回复:] 哦..那可能是用的json工具不一样... 我用fastjson

public class Demo {

	public static void main(String[] args) throws Exception {
		Dat obj = JSONObject.parseObject("{'date' : '2010-1-2 12:00:00'}", Dat.class);
		System.out.println(obj.getDate());
	}

}

class Dat {
	
	private Date date;

	public Date getDate() {
		return date;
	}
	
	public void setDate(Date date) {
		this.date = date;
	}
	
}
没报错,按理空格不应该会导致错误
嗯,我也是这样认为,应该是SpingMVC自带的JSON转换工具不支持带空格的字符串。[/quote] 好像可以配置下让他用我们选的json工具
JeffYL 2015-08-06
  • 打赏
  • 举报
回复
引用 4 楼 scmod 的回复:
哦..那可能是用的json工具不一样... 我用fastjson

public class Demo {

	public static void main(String[] args) throws Exception {
		Dat obj = JSONObject.parseObject("{'date' : '2010-1-2 12:00:00'}", Dat.class);
		System.out.println(obj.getDate());
	}

}

class Dat {
	
	private Date date;

	public Date getDate() {
		return date;
	}
	
	public void setDate(Date date) {
		this.date = date;
	}
	
}
没报错,按理空格不应该会导致错误
嗯,我也是这样认为,应该是SpingMVC自带的JSON转换工具不支持带空格的字符串。
scmod 2015-08-06
  • 打赏
  • 举报
回复
哦..那可能是用的json工具不一样... 我用fastjson

public class Demo {

	public static void main(String[] args) throws Exception {
		Dat obj = JSONObject.parseObject("{'date' : '2010-1-2 12:00:00'}", Dat.class);
		System.out.println(obj.getDate());
	}

}

class Dat {
	
	private Date date;

	public Date getDate() {
		return date;
	}
	
	public void setDate(Date date) {
		this.date = date;
	}
	
}
没报错,按理空格不应该会导致错误
JeffYL 2015-08-06
  • 打赏
  • 举报
回复
我测试过了,应该是空格的问题,以下是我的单元测试 @Test public void testInsertObject() throws Exception { String url = URI + "/object"; TestVO anObject = new TestVO(); anObject.setCreateDate("2015-07-31 00:00:00"); Gson gson = new Gson(); String json = gson.toJson(anObject); byte[] content = json.getBytes("UTF-8"); MvcResult result = this.mockMvc.perform(MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON) .content(json)) .andDo(print()) .andReturn(); } 这样会报错,如果改成nObject.setCreateDate("2015-07-31-00:00:00"); 就不会报错了
tony4geek 2015-08-06
  • 打赏
  • 举报
回复
Could not read JSON: Unexpected end-of-input in VALUE_STRING at [Source: org.apache.catalina.connector.CoyoteInputStream@2e330425; line: 1, column: 91]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected end-of-input in VALUE_STRING json 格式的问题吧。把json 格式截取出来找个工具验证看看
scmod 2015-08-06
  • 打赏
  • 举报
回复
Unexpected end-of-input in VALUE_STRING line: 1, column: 91 json方便发下看下不... 应该不会是空格的问题..
[ 2021年,将Spring全家桶的课程进行Review,确保不再有顺序错乱等问题导致学员看不懂内容,进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并开始逐步增加高阶的Spring Security等内容,课件将逐步进行上传,敬请期待! ]本课程是Spring全家桶案例精讲课程的第二部分Spring MVCSpring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Java Spring的Web知识点,主要是关于Spring MVC的应用,包含:表单的增删改查、国际化、过滤器、拦截器、日志Log4j2及slf4j的使用、主题更改网站皮肤及样式、文件上传等的案例讲解,并且最后以一个SSM(Spring+Spring MVC+Mybatis)贯穿前后台的案例作为Spring MVC课程的终奖, 从而使大家快速掌握Spring的基础核心知识,快速上手,为面试、工作等做好充足准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVCSpring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验 【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧