2

JSONをSpringMVCコントローラーに送信しようとしています。Spring MVC側では、すべてが正しく構成されています。

以下はコードですが、実行されていないようです:

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>  
<script type="text/javascript">
  $('#myForm').on('submit', function(e) { 
    e.preventDefault(); 
    var frm = $("#myForm"); 
    var dat = frm.serialize(); 
    $.ajax({ 
    type: 'POST', 
    url: $('#myForm').attr('action'), 
    data: dat, 
    contentType: 'application/json' 
    success: function(hxr) { 
        alert("Success: " + xhr); 
    } 
}); 
});   
 </script>   
</head>
<body>
<h2>Application</h2>
<form id="myForm" action="/application/save" method="POST" accept="application/json" onclick="i()">
                <input type="text" name="name" value="myName">
    <input type="submit" value="Submit">
</form>

Tomcatでは、次のエラーが発生します。

org.springframework.web.servlet.mvc.support.DefaultHandlerE xceptionResolver handleNoSuchRequestHandlingMethod警告:サーブレットリクエストに一致するハンドラメソッドが見つかりません:パス'/ application / save'、メソッド'POST'、パラメータmap ['name'-> array ['自分の名前']]

私が間違っているアイデアはありますか?JSONは初めてです。JSONをSpringMVCコントローラーに送信しようとしています。

@Controller
@RequestMapping("/run/*")
public class HistoryController {

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

@RequestMapping(value = "find", method = RequestMethod.GET)
public @ResponseBody Response find() {
    System.out.println("Run");
    Response userResponse = new Response();
    userResponse.setVersionNumber("1.0");
    return userResponse;
}

/ application / run / saveを呼び出すと、JSON応答が返されます。ただし、@RequestBodyは機能しません。


私はまだ運がありませんでした。いくつかの同様の問題を読んだことがあります。要件は、サーバーがapplication/jsonタイプのみを受け入れることです。SpringMVCコントローラーを使用しています。前述のように、コードは@ResponseBodyを介してJSONとして応答を送り返します。SpringMVCコントローラーの@RequestBodyを介して情報を取得したい。JSPを使用してJSONをSpringMVCControllerに送信しています。私のコードとSpringMVCは以下のとおりです。

JSONとJavascriptは初めてです。

JSP-index.jsp

<%@page language="java" contentType="text/html"%>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>  
<script type="text/javascript">
    $('#myForm').on('submit', function(e) { 
    var frm = $("#myForm");
   var dat = JSON.stringify(frm.serializeArray()); 

$.ajax({ 
     type: 'POST', 
     url: $('#myForm').attr('action'), 
     data: dat,
     contentType: 'application/json',
     dataType: 'json',
     error: function() {
        alert('failure');
     }
     success: function(hxr) { 
         alert("Success: " + xhr); 
     }
  }); 
); 
}; 
</script> 
</head>
<body>
<h2>Application</h2>
<form id="myForm" action="/application/save" method="POST" accept="application/json" onclick="i()">
    <input type="text" name="userId" value="User">
    <input type="submit" value="Submit">
</form>
</body>
</html>

これを実行すると、出力が得られません。Chromeでは404Notfoundエラーが発生し、Tomcatでは次のエラーが発生します。

org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver     handleNoSuchRequestHandlingMethod
WARNING: No matching handler method found for servlet request: path '/application/sa
 ve', method 'POST', parameters map['userId' -> array<String>['User']]

ここでJSPの部分に何か問題がありますか?

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
     version="2.5">

     <display-name>WebApp</display-name>

     <context-param>
        <!-- Specifies the list of Spring Configuration files in comma separated format.-->
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/service.xml</param-value>
     </context-param>

     <listener>
        <!-- Loads your Configuration Files-->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

     <servlet>
        <servlet-name>application</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
     </servlet>

     <servlet-mapping>
        <servlet-name>application</servlet-name>
        <url-pattern>/</url-pattern>
     </servlet-mapping>

     <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>    
</web-app>

service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

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

    <mvc:annotation-driven/>

    <context:annotation-config/>

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

    <bean id="jacksonMessageChanger" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json"/>
    </bean>

    <!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageChanger"/>
            </list>
        </property>
    </bean>-->

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="jacksonMessageChanger"/>
            </util:list>
        </property>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json"/>
            </map>
        </property>
    </bean>-->  
</beans>

コントローラ

package com.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestBody;
import com.webchannel.domain.User;
import com.webchannel.domain.UserResponse;

@Controller
@RequestMapping("/application/*")
public class SaveController {

@RequestMapping(value = "save", method = RequestMethod.POST, 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;
}

@RequestMapping(value = "delete", method = RequestMethod.GET)
public @ResponseBody UserResponse delete() {
    System.out.println("Delete");
    UserResponse userResponse = new UserResponse();
    userResponse.setSuccess(true);
    userResponse.setVersionNumber("1.0");
    return userResponse;
}
}

/ application / deleteを呼び出すと、JSONが返されます。したがって、JacksonProcessorが正しく構成されていることがわかります。問題は@RequestBodyにあります。

どこが間違っているのですか?私を助けてください。

4

4 に答える 4

1

いくつか変更が必要かもしれないと思います

  1. コントローラにはが含まれている@RequestMapping("/run/*")ため、これをに変更する必要があります。また、コントローラで'save`メソッドを定義しているため@RequestMapping("/run/")、jspフォームアクションで変更する必要がある場合があります。<form id="myForm" action="/application/run/save" method="POST" accept="application/json" onclick="i()">@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"})

  2. 次のようなコントローラーのsaveメソッドで@RequestParamを定義する必要がある場合があります。public @ResponseBody Response save(@RequestParam(required=true, value="name") String name, @RequestBody User user) throws Exception {...}

送信するリクエストにハンドラーが添付されていないことが明確に示されているためです。

于 2012-09-17T19:19:54.350 に答える
1

いくつかの異なる問題があるように思われるため、この質問を理解するのは少し難しいです。

しかし、この問題だけを見ると:

Tomcat では、次のエラーが発生します。

org.springframework.web.servlet.mvc.support.DefaultHandlerE xceptionResolver handleNoSuchRequestHandlingMethod 警告: サーブレット要求に一致するハンドラー メソッドが見つかりません: パス '/application/run'、メソッド 'POST'、パラメーター map['name' -> array['自分の名前']]

投稿した HTML には、<form>が に設定されPOSTてい/application/runます。

ただし、@Controllerクラスには、この URL にバインドされたメソッドはありません。

クラスに で@RequestMapping("/run/*")注釈を付け、メソッドに で注釈を付けた@RequestMapping("save")ので、save()メソッドは実際には URL にバインドされます/run/save。これは、 でデータを送信して$.ajax()いる URL でも、フォームが指している URL でもありません。

org.springframework.webロガーのロギングを有効にすることをお勧めしDEBUGます-アプリの起動時に、Spring は各メソッドがマップされているすべての URL をログに記録します。

于 2012-09-17T19:15:41.800 に答える
0

以下を試してください

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>  
<script type="text/javascript">
$('#myForm').on('submit', function(e) {
    e.preventDefault();
    var frm = $("#myForm");
    var dat = frm.serialize();
    $.ajax({
        type: 'POST',
        url: $('#myForm').attr('action'),
        data: dat,
        contentType: 'application/json'
        success: function(hxr) {
            alert("Success: " + hxr);
        }
    });
});    
</script>   
</head>
<body>
<h2>Application</h2>
<form id="myForm" action="/application/run" method="POST">
    <input type="text" name="name" value="myName">
    <input type="submit" value="Submit">
</form>​

dataType:'json'、サーバーから期待される形式を指定しています。

また、ハンドラー コードを投稿する場合は、支援することをお勧めします。

于 2012-09-17T18:37:25.883 に答える
0

にマップされたコントローラーにはメソッドがありません/application/run。どちらを呼び出したいかわかりませんが、にまたはurlを追加する必要があります。または、 にマップされたメソッドを作成します。乾杯!findsave/application/run

于 2012-09-17T21:39:01.257 に答える