【问题标题】:SpringMVC ajax request - java.io.EOFException: No content to map to Object due to end of inputSpringMVC ajax 请求 - java.io.EOFException:由于输入结束,没有要映射到对象的内容
【发布时间】:2013-05-06 23:46:01
【问题描述】:

我正在开发一个 SpringMVC 应用程序,我使用 ajax 调用从数据库中请求了一些数据,这些数据作为 json 对象返回。我现在必须将此数据发送回服务器进行一些处理并返回到表单。

但是我在浏览器中遇到了一个错误服务器遇到了一个内部错误,导致它无法满足这个请求。在调查错误日志时我看到了这个:

错误日志

Controller [com.crimetrack.web.MapController]
Method [public com.crimetrack.business.Marker com.crimetrack.web.MapController.getNewCoordinates(com.crimetrack.business.Marker) throws java.lang.Exception]

java.io.EOFException: No content to map to Object due to end of input
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:1324)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1275)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:941)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:124)
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:120)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:91)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:71)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)

Ajax 调用

 $('#getCoordinates').on('click',function(){

        $.each(global_citizens, function(i, gc){

            $.ajax({
                type:'GET',
                url:'getNewCoordinatesForMarkers.htm',
                contentType: 'application/json',
                data:{citizens:JSON.stringify(global_citizens[i])},
                dataType: 'json',
                success:function(new_citizens){
                       $.each(new_citizens, function(i, c) {

                           console.log(c.name + ' | ' + c.socialSecurityNumber + ' | ' + c.lat+ ' | ' +c.lng);

                        });                                 
                }                           
            });             
        }); 
    });

控制器

@RequestMapping(value = "getNewCoordinatesForMarkers.htm", method = {RequestMethod.GET}, headers = {"content-type=application/json"})
public @ResponseBody  Marker getNewCoordinates(@RequestBody Marker citizens)throws Exception{

    logger.info("Getting Markers");
    Marker citizenMarker = this.markerManager.getNextLocation(citizens);

    return citizenMarker;

}

Marker.java

public class Marker  implements Serializable{

    private int socialSecurityNumber;
    private String name;
    private int citizenType;
    private double lat;
    private double lng;

//getters and setters

JSON 数据 - 取自萤火虫控制台

citizens{"name":"Jessie Small","lat":10.670044,"lng":-61.515305,"socialSecurityNumber":1999020214,"citizenType":3}

FireBug - 正在传递内容

Connection  close
Content-Length  3696
Content-Type    text/html;charset=utf-8
Date    Tue, 07 May 2013 05:52:09 GMT
Server  Apache-Coyote/1.1
Request Headers
Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Type    application/json
Cookie  tinymcePasteText=1; JSESSIONID=CC4F12D00C836FE0DB86D2493556275C
Host    localhost:8084
Referer http://localhost:8084/crimeTrack/crimeTrackMap.htm
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
X-Requested-With    XMLHttpRequest

【问题讨论】:

  • 似乎你需要注册你的自定义活页夹或者只是简单地返回 String 而不是 List
  • 我现在只返回一个对象标记。如果我返回一个 Object 而不是 List 我还需要注册一个自定义活页夹吗?你能给我举一个关于如何做到这一点的好例子吗
  • 我做了这段代码,但我手动将字符串构造为 json 格式。你想要那个?
  • 是的,我肯定会看看它,我已经坚持了很长时间。问题是一旦请求到达控制器就会发生这种情况,它不会进入控制器方法
  • 哈哈没有人它的测试数据

标签: java spring spring-mvc


【解决方案1】:

我做了这个代码来预加载获取自动完成功能的 allproduct,也许这个例子不完全适合你的代码,但我希望你能从中得到一些东西:

控制器功能:

@RequestMapping(value = "allproduct", method = RequestMethod.GET, headers = "Accept=*/*")
public @ResponseBody
String productList() {
    List<Product> products = ProductDAO.INSTANCE.listProduct();
    String json = "[";
    for (int i = 0; i < products.size(); i++) {
        Product o = products.get(i);
        if (i > 0) {
            json += ",";
        }
        json += "{\"value\":\"" + o.getCode() + "\",\"label\":\""
                + o.getCode() + " - " + o.getProvider() + " - "
                + o.getNominal() + "\",\"price\":\""
                + o.getPrice() + "\",\"cost\":\"" + o.getCost() + "\"}";
    }
    json += "]";
    System.out.println(json);
    return json;
}

在我的 jsp 中,我使用 jquery 来调用该函数:

$.getJSON('/product/allproduct', function(json) {
    $("#product").autocomplete({
        source : json,
        select : function(event, ui) {
            $("#product").val(ui.item.value);
            $("#kredit").val(ui.item.cost);
            $("#price").val(ui.item.price);
            return false;
        }
    });
});

看看json format here。数组示例:

[
    {
        "name": "Jason",
        "number": "10"
    },
    {
        "name": "Jimmy",
        "number": "11"
    }
]

【讨论】:

  • 它在服务器上处理 json 会导致问题,但感谢您的代码
  • 嘿,你看过这里stackoverflow.com/questions/3921736/… 吗?
  • 是的,我看到了这个问题,我不明白如何为这个类注册一个自定义数据绑定器,你能帮忙吗
  • 但是您的错误没有显示绑定错误。如果您首先将参数标记公民更改为直接字符串,您会如何获得该值?还可以查看mkyong.com/java/how-to-convert-java-object-to-from-json-jackson 将 json 转换为 Java 对象
  • 嘿,谢谢我从 json 对象到 java 对象的转换,它对我有用。非常感谢您的帮助
【解决方案2】:

这是对我有用的控制器的更改

@RequestMapping(value = "getNewCoordinatesForMarkers.htm", method = {RequestMethod.POST},produces = "application/json; charset=utf-8")
    public @ResponseBody  Marker getNewCoordinates(@RequestBody Marker json)throws Exception{

        JSONObject jsonObj = JSONObject.fromObject(json);

        ObjectMapper mapper = new ObjectMapper();

         Marker citizen = mapper.readValue(jsonObj.toString(), new TypeReference<Marker>(){});


        logger.info("Getting Markers");
        Marker citizenMarker = this.markerManager.getNextLocation(citizen);

        return citizenMarker;

    }

【讨论】:

    【解决方案3】:

    如果您不在标头中包含“Content-Length”,则会收到该错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2018-09-23
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多