【发布时间】:2015-10-07 06:52:14
【问题描述】:
目前,我需要向 ajax 请求发送一个大的 json 对象。为此,我使用了以下控制器方法,它工作正常。
@RequestMapping(method = RequestMethod.POST,params = {"dynamicScenario"})
@ResponseBody
public String getDynamicScenarioData(@RequestParam Map<String, String> map) throws JsonParseException, JsonMappingException, IOException
{
ObjectMapper mapper = new ObjectMapper();
@SuppressWarnings("unchecked")
Map<String,Object> queryParameters = mapper.readValue(map.get("parameters") , Map.class);
Map<String, Object> getData = service.runDynamicScenario(queryParameters, map.get("queryString"));
return writer.writeValueAsString(getData); //here java throws java.lang.OutOfMemoryError: Java heap space memory
}
更新: 我的 ajax 是:
$.ajax({
type: "POST",
url: "dynamicScenario.htm",
data : tags,
dataType: "json",
success: function(data){});
我的 DispatcherServlet 设置:
public class ApplicationInitializer implements WebApplicationInitializer
{
public void onStartup(ServletContext servletContext) throws
ServletException
{
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(ApplicationConfig.class);
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
servletRegistration.setLoadOnStartup(1);
servletRegistration.addMapping("*.htmlx");
}
}
我正在使用 jackson 序列化不同对象的映射,然后将其发送回 ajax。但是,如果 json 的大小很大,那么 java 就会内存不足。我知道 Jackson 方法 writer.writeValueAsString 效率低下,因为它写入字符串但还有其他选择吗?我不能使用普通的 java POJO,因为我不知道我必须序列化的映射将包含哪些对象,所以我不能简单地将它映射到某个 java 对象。有任何想法吗?谢谢
【问题讨论】:
-
你为什么不让你的方法返回类型
Map<String, Object>并返回getData? Jackson 应该能够在序列化的同时进行流式传输。 -
我已经尝试过了,但我得到的状态代码:406 Not Acceptable in response..
-
您在请求中发送了什么
Accept标头? -
我已经粘贴了我的 ajax..我的数据类型是“json”所以它应该可以工作..
-
向我们展示您的 MVC 配置。另外,不要将 JSON 作为表单参数发送。直接在请求正文中发送并使用
@RequestBody让Spring 将其直接反序列化为Map<String,Object>。
标签: java ajax json spring-mvc jackson