当前位置: 首页 > 面试题库 >

通过Spring MVC JSON杰克逊处理器发送的@RequestBody

阴永逸
2023-03-14
问题内容

我已经阅读了许多类似的问题,包括:JQuery,Spring MVC@RequestBody和使它与Spring的JQuery / Ajax一起使用JSON请求

要求是服务器仅接受应用程序/ json类型。我正在使用SpringMVC控制器。该代码通过@ResponseBody将响应作为JSON发送回。我想通过Spring MVCController中的@RequestBody获取信息。我正在使用JSP将JSON发送到Spring MVC Controller。我的代码和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中,我得到404 Not found错误,在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>-->

控制

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中。

我要去哪里错了?

如果我在下面的代码中删除标题,则会出现415错误。

@RequestMapping(value = "save", method = RequestMethod.POST) 
 public @ResponseBody UserResponse save(@RequestBody User user) throws Exception { 
  UserResponse userResponse = new UserResponse(); 
 System.out.println("UserId :" + " " + user.getUserId()); 
 return userResponse; 
}

我快要接近了,但能得到帮助。


问题答案:

我尝试对您的代码进行更多操作,但是无法获得与您遇到的错误相同的错误。我重新制作了HTML:

<html>
<head>
<script type="text/javascript" src="https://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 : "POST",
                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/save">
        <input type="text" name="userId" value="User">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

我有一个非常简单的方法,类似于您的方法:

@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"})
public @ResponseBody String save (@RequestBody User user) throws Exception
{
    return "save-test";
}

我的用户类如下所示:

public class User
{
    private String userId;

    public User()
    {
    }

    public String getUserId ()
    {
        return userId;
    }

    public void setUserId (String userId)
    {
        this.userId = userId;
    }
}

我的spring配置被剥离为包含:

<context:component-scan base-package="com.web"/> 
<mvc:annotation-driven/> 
<context:annotation-config/>

我正在使用Spring 3.1.1和jquery
1.8.1(我相信是最新的)。我没有遇到与您相同的错误,因此也许您可以尝试一些我所做的事情,看看是否有帮助。



 类似资料:
  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 我需要使用Jackson解析器来处理包含非标准单引号而不是双引号的json。以前有人问过这个问题: 配置Jackson以反序列化单引号(无效)JSON 但是“JsonParser”类在杰克逊 2.0 中不再存在。看起来配置对象映射器的较新方法是这样的: 但我找不到ALLOW_SINGLE_QUOTES功能。也许我只是没看到。 如何在Jackson 2.x中反序列化单引号? 编辑 OOPS,没关系。

  • 问题内容: 我的问题很简单:我有以下简单的类: 我正在尝试处理以下JSON: 显然,这里存在一个问题(“ blah”无法解析为int) 以前,Jackson抛出类似org.codehaus.jackson.map.JsonMappingException的内容:无法从字符串值’blah’构造java.lang.Integer的实例:不是有效的Integer值 我同意这一点,但是我想在某个地方注册一

  • 比如说我有亲子关系。我的父母看起来像 假设我想要(反)序列化的模型在父对象和子对象之间有一个中间对象。 我可以将Jackson配置为在将json反序列化到模型中时创建该中间对象,并在序列化回json时同样跳过该中间对象吗?

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 首先,我不熟悉Jython。我正在寻找一种将python代码集成到Java项目中的方法。因此我正在调查Jython。 我正在尝试将一个 json 字符串转换为 Java 对象 - 在 python 中。 首先,我一直在努力让Jython找到我的java类。由于缺乏更优雅的解决方案,我可以通过简单地执行以下操作来向前迈进: 无论如何。。。 我正在尝试以下操作: 但是,在运行时,我收到以下错误: 我不

  • 当我尝试反序列化汽车类时,我得到了下面的错误。杰克逊正试图在父类中的子元素中搜索字段。我如何确保杰克逊使用适当的子类型进行反序列化?我相信我需要使用混合/客户转换器。但我不确定如何在这个特定场景中使用它们。 注意:在我的例子中,除TestMain之外的所有类都在一个jar文件中,我不能修改源文件。 错误 线程"main"中的异常com.fasterxml.jackson.databind.exc.