복붙노트

[SPRING] SpringMVC ajax 요청 - java.io.EOFException : 입력 끝으로 인해 Object에 매핑 할 내용이 없습니다.

SPRING

SpringMVC ajax 요청 - java.io.EOFException : 입력 끝으로 인해 Object에 매핑 할 내용이 없습니다.

SpringMVC 응용 프로그램에서 일하고 있는데, json 객체로 돌아온 ajax 호출을 사용하여 데이터베이스의 일부 데이터를 요청했습니다. 이제이 데이터를 일부 처리를 위해 서버로 다시 보내고 양식으로 리턴해야합니다.

그러나 브라우저에서 오류가 발생합니다. 서버가이 요청을 수행하지 못하게하는 내부 오류가 발생했습니다. 오류 로그 조사에서 나는 이것을 보았다 :

오류 기록

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)

아약스 콜

 $('#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

해결법

  1. ==============================

    1.이 코드는 자동 완성 기능을 위해 allproduct를 가져 오기 위해 사전로드 한 것입니다.이 예제는 코드에 완전히 들어 맞지 않지만 다음과 같이 얻을 수 있기를 바랍니다.

    이 코드는 자동 완성 기능을 위해 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 형식을 찾아보십시오. 배열 예제 :

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

    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. ==============================

    3.헤더에 "Content-Length"를 포함시키지 않으면 오류가 발생합니다.

    헤더에 "Content-Length"를 포함시키지 않으면 오류가 발생합니다.

  4. from https://stackoverflow.com/questions/16409036/springmvc-ajax-request-java-io-eofexception-no-content-to-map-to-object-due-t by cc-by-sa and MIT license