@ResourceMapping, который принимает JSON из запроса Ajax
Я ищу, как я могу интерпретировать параметр JSON в моем @ResourceMapping в Spring Portlet MVC. Когда я добавил @RequestBody, я получил сообщение: @RequestBody не поддерживается... Действительно застрял на этом.
У меня есть это:
Вид сбоку:
<portlet:resourceURL var="getTest" id="ajaxTest" ></portlet:resourceURL>
<p>
<button onClick="executeAjaxTest();">Klik mij!</button>
<button onClick="$('#ajaxResponse').html('');">Klik mij!</button>
</p>
<p>
<h3>Hieronder het antwoord:</h3>
<h4 id="ajaxResponse"></h4>
</p>
<script>
function executeAjaxTest() {
var jsonObj = {
user: "Korneel",
password: "testpassword",
type: {
testParam: "test",
}
}
console.debug(JSON.stringify(jsonObj));
$.ajax({
dataType: "json",
contentType:"application/json",
mimeType: 'application/json',
url:"<%=getTest%>",
data:JSON.stringify(jsonObj),
success : function(data) {
$("#ajaxResponse").html(data['testString']);
}
});
}
</script>
Сторона контроллера:
@ResourceMapping(value="ajaxTest")
@ResponseBody
public void ajaxTestMethod(ResourceRequest request, ResourceResponse response) throws IOException, ParseException {
LOGGER.debug("ajax method");
JSONObject json = JSONFactoryUtil.createJSONObject();
json.put("testString", "Ik ben succesvol verstuurd geweest!");
response.getWriter().write(json.toString());
}
Как я могу использовать весеннюю магию для автоматического сопоставления этих данных JSON с моей собственной моделью? Примечание: это Spring Portlet MVC, а не обычный Spring MVC.
3 ответа
Вам нужно построить свой объект json следующим образом:
var jsonObj = {
user: "Korneel",
password: "testpassword",
"type.testParam" : "test"
};
$.ajax({
dataType: "json",
contentType:"application/json",
mimeType: 'application/json',
url:"<%=getTest%>",
data:jsonObj,
success : function(data) {
$("#ajaxResponse").html(data['testString']);
}
});
В вашем контроллере вы должны использовать аннотацию @ModelAttribute:
@ModelAttribute(value = "jsonObj")
public JsonObjCommand obtenerJsonObjCommand() {
JsonObjCommand jsonObjCommand = new JsonObjCommand();
return jsonObjCommand;
}
@ResourceMapping(value = "ajaxTest")
public void ajaxTestMethod(
ResourceRequest request,
ResourceResponse response,
@ModelAttribute(value = "jsonObj") JsonObjCommand jsonObjCommand)
throws IOException, ParseException {
LOGGER.debug("USER: " + jsonObjCommand.getUser());
LOGGER.debug("Password: " + jsonObjCommand.getPassword());
LOGGER.debug("TestParam: " + jsonObjCommand.getType().getTestParam());
LOGGER.debug("ajax method");
JSONObject json = JSONFactoryUtil.createJSONObject();
json.put("testString", "Ik ben succesvol verstuurd geweest!");
response.getWriter().write(json.toString());
}
Не забывайте свои бобы:
public class JsonObjCommand {
private String user;
private String password;
private TypeJson type;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public TypeJson getType() {
return type;
}
public void setType(TypeJson type) {
this.type = type;
}
}
public class TypeJson {
private String testParam;
public String getTestParam() {
return testParam;
}
public void setTestParam(String testParam) {
this.testParam = testParam;
}
}
Аннотация @ResponseBody не поддерживается "из коробки" в среде портлетов Spring MVC, но вы можете реализовать @ResponseBody самостоятельно.
Мы делаем это, внедряя пользовательский тип представления, модель и преобразователь представления.
- Реализуйте пользовательскую модель и преобразователь представления (ModelAndViewResolver), скажем, JsonModelAndViewResolver.
- В методе resolModelAndView проверьте, имеет ли метод контроллера аннотацию @ResponseBody (или более конкретное условие для идентификации выходных данных JSON - например, аннотация + требуемый поддерживаемый тип MIME).
- Если да, верните свою собственную реализацию View - скажем, представление SingleObjectJson (расширяющее AbstractView).
- Передайте ваш сериализуемый объект экземпляру представления.
- Представление будет сериализовать объект в формат JSON и записать его в ответ (с помощью Jackson, Gson или другого фреймворка в методе renderMergedOutputModel).
- Зарегистрируйте новый преобразователь как AnnotationMethodHandlerAdapter.customModelAndViewResolvers.
Согласно документации, @RequestBody поддерживается только в средах сервлетов, но не в средах портлетов (то же самое для @ResponseBody). Кажется, вы не можете использовать эту функциональность.