0

私はJacksonプロセッサでSpringMVCを使用しています。JSONリクエストがPOSTリクエストとしてサーバーに送信されると、@RequestBodyが必要なオブジェクトに逆シリアル化されます。問題はGETリクエストが送信されたときに発生し、実際にはHttp500内部サーバーエラーが表示されます。スローされる例外は次のとおりです。

java.io.EOFException: No content to map to Object due to end of input 
org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2022) 
org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1974) 
org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1331) 
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal  (MappingJacksonHttpMessageConverter.java:135) 
org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:633) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:597) 
 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments  (HandlerMethodInvoker.java:346) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

空の文字列は送信されず、正しいJSONがサーバーに送信されます。なぜこれが起こっているのかわかりません。以下は私のコードです:

JSP-index.jsp

<%@page language="java" contentType="text/html"%>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>  
<script type="text/javascript">
$(function() {  
$('#myForm').submit(function() { 
    var form = $( this ), 
        url = form.attr('action'), 
        userId = form.find('input[name="userId"]').val(),
        dat = JSON.stringify({ "userId" : userId }); 

    $.ajax({ 
        url : url, 
        type : "GET", 
        traditional : true, 
        contentType : "application/json", 
        dataType : "json", 
        data : dat, 
        success : function (response) { 
            alert('success ' + response); 
        }, 
        error : function (response) { 
            alert('error ' + response); 
        }, 
    }); 

    return false; 
   }); 
 }); 
</script>
</head>
<body>
<h2>Application</h2>
<form id="myForm" action="/application/user/find" method="GET">
    <input type="text" name="userId" value="user1">
    <input type="submit" value="Submit">
</form>
      </body>
</html>

JSPとコントローラーメソッドでリクエストタイプをPOSTに変更するとすぐに、すべてが正しく機能しているように見えます。

package com.web;

@Controller
@RequestMapping("/user/*")
public class UserController {

@RequestMapping(value = "find", method = RequestMethod.GET, headers = {"content-type=application/json"})
public @ResponseBody UserResponse save(@RequestBody User user) throws Exception {
    UserResponse userResponse = new UserResponse();
                System.out.println("UserId :" + " " + user.getUserId());
    return userResponse;
}

Beans.xml

<context:component-scan base-package="com.web"/>

<mvc:annotation-driven/>

<context:annotation-config/>

User.java

public class User implements Serializable {

private String userId;

public User() {

}

// Getters and setters
}

GETリクエストが送信されると、ブラウザは通常%%user%%を表示します。これは単なる例です。Jacksonプロセッサは引き続きGETリクエストを読み取りますか?

問題がどこにあるのかわかりません。お役に立てば幸いです。

4

1 に答える 1

1

http://api.jquery.com/jQuery.ajax/で、jQuey.ajax()のデータパラメーターの機能に関する次の説明を読みました。

サーバーに送信されるデータ。まだ文字列でない場合は、クエリ文字列に変換されます。GETリクエストのURLに追加されます。...。

そのため、URLに追加され、リクエストの本文はありません。これは、POSTを使用してデータを投稿する場合、GETセマンティクスと一致する動作です。

于 2012-09-21T14:18:46.680 に答える