@ResourceMapping 接受来自 Ajax 请求的 JSON
@ResourceMapping that accepts JSON from Ajax request
我正在搜索如何在 Spring Portlet MVC 中解释我的 @ResourceMapping 中的 JSON 参数。当我添加@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());
}
我如何使用 spring 魔法将此 JSON 数据自动映射到我自己的模型?
注意:它是 Spring Portlet MVC,不是常规的 Spring MVC..
根据文档,@RequestBody 仅在 Servlet 环境中受支持,Portlet 环境中不受支持(@ResponseBody 也是如此)。所以您似乎无法使用该功能。
@ResponseBody 注释在 Spring MVC portlet 框架中不支持开箱即用,但您可以自己实现 @ResponseBody 处理。
我们通过实现自定义视图类型和模型以及视图解析器来实现。
- 实施自定义模型和视图解析器 (ModelAndViewResolver),比方说 JsonModelAndViewResolver。
- 在 resolveModelAndView 方法中,检查控制器方法是否有 @ResponseBody 注释(或更具体的条件来识别 JSON 输出 - 例如注释 + 需要支持的 mime 类型)。
- 如果是,return 您的自定义视图实现 - 假设 SingleObjectJson 视图(扩展 AbstractView)。
- 将您的待序列化对象传递给视图实例。
- 视图会将对象序列化为 JSON 格式并将其写入响应(通过在 renderMergedOutputModel 方法中使用 Jackson、Gson 或其他框架)。
- 将新解析器注册为 AnnotationMethodHandlerAdapter.customModelAndViewResolvers。
您需要像这样构建 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;
}
}
我正在搜索如何在 Spring Portlet MVC 中解释我的 @ResourceMapping 中的 JSON 参数。当我添加@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());
}
我如何使用 spring 魔法将此 JSON 数据自动映射到我自己的模型? 注意:它是 Spring Portlet MVC,不是常规的 Spring MVC..
根据文档,@RequestBody 仅在 Servlet 环境中受支持,Portlet 环境中不受支持(@ResponseBody 也是如此)。所以您似乎无法使用该功能。
@ResponseBody 注释在 Spring MVC portlet 框架中不支持开箱即用,但您可以自己实现 @ResponseBody 处理。
我们通过实现自定义视图类型和模型以及视图解析器来实现。
- 实施自定义模型和视图解析器 (ModelAndViewResolver),比方说 JsonModelAndViewResolver。
- 在 resolveModelAndView 方法中,检查控制器方法是否有 @ResponseBody 注释(或更具体的条件来识别 JSON 输出 - 例如注释 + 需要支持的 mime 类型)。
- 如果是,return 您的自定义视图实现 - 假设 SingleObjectJson 视图(扩展 AbstractView)。
- 将您的待序列化对象传递给视图实例。
- 视图会将对象序列化为 JSON 格式并将其写入响应(通过在 renderMergedOutputModel 方法中使用 Jackson、Gson 或其他框架)。
- 将新解析器注册为 AnnotationMethodHandlerAdapter.customModelAndViewResolvers。
您需要像这样构建 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;
}
}