Java 为什么Spring MVC GET方法不通过json值设置POJO类?

Java 为什么Spring MVC GET方法不通过json值设置POJO类?,java,json,spring-mvc,Java,Json,Spring Mvc,我在GET方法实现过程中遇到了这个错误 java.io.EOFException: No content to map to Object due to end of input 我的控制器 @RequestMapping(value = "/Login.htm", method = RequestMethod.GET,consumes="application/json",produces="application/json") public @ResponseBody Map

我在GET方法实现过程中遇到了这个错误

java.io.EOFException: No content to map to Object due to end of input
我的控制器

   @RequestMapping(value = "/Login.htm", method = RequestMethod.GET,consumes="application/json",produces="application/json")
    public @ResponseBody Map<String, Object> Login(HttpServletRequest request,@RequestBody UserInput user) {

        Map<String, Object> modelMap = new HashMap<String, Object>(1);
        modelMap.put("status",userManagerDAO.LoginUser(user));
        return modelMap;

    }

Get请求将没有正文。为了让它正常工作,您可以在URL中包含json对象作为参数, 使用该参数,然后使用JSON解析器将其解析为对象

类似于:
http:///Login.htm?input={“cusId”:1,“loginId”:“123ASDF”,“密码”:“test123”}

别忘了对URL进行编码

public Map<String, Object> Login(HttpServletRequest 
request,@RequestParam(value="input")String userInput) {
    // Convert userInput string to UserInput object, use Jackson.
    Map<String, Object> modelMap = new HashMap<String, Object>(1);
    modelMap.put("status",userManagerDAO.LoginUser(user));
    return modelMap;

}
publicmap登录(HttpServletRequest
请求,@RequestParam(value=“input”)字符串userInput){
//将userInput字符串转换为userInput对象,使用Jackson。
Map modelMap=新的HashMap(1);
modelMap.put(“状态”,userManagerDAO.LoginUser(用户));
返回模型图;
}
PS:通过URL发送JSON对象只是为了支持GET是不可取的。POST是正确的方法。因为
1.安全性如果您使用的是https,没有人能看到req正文中的内容。

2.URL长度是有限的,如果您的json非常大,则Get将中断。

这是RestClient的一个限制,可能有许多(如果不是全部的话)XMLHttpRequest实现

基本上,如果您尝试
curl
ing为您服务

curl -XGET "localhost:8080/myapp/Login.htm" -H"Content-Type: application/json" -d '{
    "cusId":1,
    "loginId" : "123ASDF",
    "password": "test123"
}'
您将看到端点工作正常

问题在于Firefox(和Chrome)中的
XMLHttpRequest
实现显然不支持发送带有
GET
请求的实体


因此,您只剩下
发布它,将您的身体编码为@shryaskn建议的请求参数,或者在中间放置一个代理为您翻译请求。

您如何调用端点?通过Rest ui界面,如果可以,显示调用它的代码-现在很难说有什么问题。我们需要查看您的js代码。我是te使用Mozila restclient插件进行测试并添加此标题Accept application/json Content Type application/jsonI不喜欢这种实现方式,因为我不习惯在URLARGE中传递任何参数,但服务器语义通常不会以GET有主体的方式实现。虽然理论上可能,但大多数人不使用它这样。好吧,spring确实允许使用body进行GET,问题是关于spring的。基本上,这不是端点如何编写的问题-OPs java代码是完全合法的。问题在客户端。我怀疑spring是否允许,让我检查一下。另外,请参阅这篇文章。这可以与任何测试工具(如Jmeter或r)一起工作est服务工具以及java resthttpclient?@jayesh jmeter不支持它。Apache HttpClient默认不支持它,但您可以强制它使用如所示的方式。您可以通过运行
nc-l
然后将请求发送到该端口来测试您正在使用的任何工具。
nc
将把整个请求打印到控制台
curl -XGET "localhost:8080/myapp/Login.htm" -H"Content-Type: application/json" -d '{
    "cusId":1,
    "loginId" : "123ASDF",
    "password": "test123"
}'