【问题标题】:Spring 3.0 and jackson: posting a composite entitie with ajax+jsonSpring 3.0 和 jackson:使用 ajax+json 发布复合实体
【发布时间】:2011-08-12 16:56:13
【问题描述】:

我正在使用 spring 3.0 以及 ajax 和 JSON,所以我有下一个域类:

public class WebSite {
int id;
String description;
SimpleType type;

    //getters and setters ...
    //...
}

SympleType 类是:

public class SimpleType {
int id;

    //getter and setters...
    //...
}

所以我为我的第一个域类创建了一个控制器,它是这样的:

@Controller
@RequestMapping(value="/web")
public class PaginaWebController {

    @RequestMapping(method=RequestMethod.GET)
    public String getCreateForm(Model model) {
        model.addAttribute(new WebSite());
        return "web/addWeb";
    }

    @RequestMapping(method=RequestMethod.POST)
    public @ResponseBody Map<String, ? extends Object> create(@RequestBody WebSite webSite, HttpServletResponse response) {
        System.out.println("I'm here");
        return null;
    }
}

在我的“addWeb”视图中,我有以下内容:

<%@ page session="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
    <head>
        <title>Create Web</title>
        <script type="text/javascript" src="<c:url value="/resources/jquery-1.4.min.js" /> "></script>
        <script type="text/javascript" src="<c:url value="/resources/json.min.js" /> "></script>
    </head>
    <body>
        <h1>
            Create Web
        </h1>
        <form:form modelAttribute="paginaWeb" action="web" method="post">
            <fieldset>      
                <legend>Account Fields</legend>
                <p>
                    <form:label id="idLabel" for="id" path="id" cssErrorClass="error">ID</form:label><br/>
                    <form:input path="id" /><form:errors path="id" />
                </p>
                <p> 
                    <form:label for="descripcion" path="descripcion" cssErrorClass="error">descripcion</form:label><br/>
                    <form:input path="descripcion" /><form:errors path="descripcion" />
                </p>

                <p> 
                    <form:label for="tipo" path="tipo" cssErrorClass="error">Tipo:</form:label><br/>
                    <form:input path="tipo" /><form:errors path="tipo" />
                </p>

                <p> 
                    <input id="create" type="submit" value="Create" />
                </p>
            </fieldset>
        </form:form>
    </body>

    <script type="text/javascript"> 
        $(document).ready(function() {
            $("#paginaWeb").submit(function() {
                var account = $(this).serializeObject();
                $.postJSON("web", account, function(data) {
                    //some useful code goes here...
                    //...
                });
                return false;               
            });
        });
    </script>
</html>

所以,我使用 JSON 将表单发布到控制器,但它不起作用,当我按下提交时,我得到下一个错误:

WARNING: StandardWrapperValve[Spring MVC Dispatcher Servlet]: PWC1406: Servlet.service() for servlet Spring MVC Dispatcher Servlet threw exception
        org.codehaus.jackson.map.JsonMappingException: Can not construct instance of org.springframework.samples.mvc.ajax.account.SimpleType, problem: no suitable creator method found
         at [Source: org.apache.catalina.connector.CoyoteInputStream@f624f7; line: 1, column: 33]
            at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160)
            at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:214)
            at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:533)
            at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:355)
    ...

有人可以帮帮我吗?我真的被困在这个了。任何帮助将不胜感激。

干杯!

【问题讨论】:

    标签: ajax json model-view-controller spring jackson


    【解决方案1】:

    确保您的类路径中有 jackson-core-asl 和 jackson-mapper-asl。如果你使用 maven 在你的 pom.xml 上设置类似的东西

    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    

    我注意到,尽管您在 create 方法上显式返回 null。请仔细检查。

    【讨论】:

    • 我已经正确添加了依赖项,事实上,当我使用只包含原始类型的实体时(例如,如果在类 WebSite 中我只有 id 和 description 字段)代码效果很好,当我向类添加一个不是原始类型的属性时它会失败。
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多