#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), код работает действительно хорошо, он завершается ошибкой, когда я добавляю свойство к классу, которое не имеет примитивного типа.