Весна 3.0 и Джексон: публикация составной сущности с помощью ajax json

#ajax #json #model-view-controller #spring #jackson

#ajax #json #модель-представление-контроллер #spring #джексон

Вопрос:

ну, я работаю с 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)
    ...
  

Кто-нибудь может мне помочь, пожалуйста? я действительно застрял в этом. Любая помощь будет действительно оценена.

Приветствия!

Ответ №1:

Убедитесь, что у вас есть jackson-core-asl и jackson-mapper-asl в вашем classpath. Если вы используете 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>
  

Однако я заметил, что вы явно возвращаете null в своем методе create. Пожалуйста, дважды проверьте.

Комментарии:

1. я правильно добавил зависимости, фактически, когда я работаю с сущностью, которая содержит только примитивные типы (например, если на веб-сайте класса у меня есть только поля id и description), код работает действительно хорошо, он завершается ошибкой, когда я добавляю свойство к классу, которое не имеет примитивного типа.