Spring 3.0 и Джексон: публикация составного разрешения с помощью ajax + json - PullRequest
1 голос
/ 26 апреля 2011

Хорошо, я работаю с 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 Ответ

0 голосов
/ 26 апреля 2011

Убедитесь, что на вашем пути к классам есть 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...