我有一个Spring MVC注释驱动的项目,它工作的很棒。在这一点上,我的很多表单都很小,我很容易使用Ajax请求来处理它们。我一直在使用这个插件:http://jquery.malsup.com/form/来处理我的Ajax请求,并且它一直在很好地工作。尽管我遇到了问题。我正在使用Jackson将我的@ResponseBody项目序列化为json。它工作得很好,但我遇到了我需要上传文件的第一个表单。 AjaxForm使用iframe提交技巧在较旧的浏览器上处理此操作,但警告必须将您的响应与<textarea></textarea>
包围起来,以确保所有信息都能成功到达。我一直在疯狂地环视四周,我发现我可以为我的对象制作一个自定义序列化器,但我想不出如何让我检查请求类型是否为XHR
,然后只用环绕响应的<textarea></textarea>
标签。有任何想法吗?Spring MVC 3 - Jackson - AjaxForm
下面是我的一些代码:提前
public @ResponseBody
JsonResponse setReferenceNumber(@ModelAttribute("referenceNumber")
@Valid ReferenceNumberBean referenceNumber,
BindingResult result,
HttpServletResponse response)
{
//Do some stuff
//Theoretically here I would call upon some logic to surround the response?
return jsonResponse;
}
谢谢!
UPDATE - 我几乎以为我已经解决了这一问题,特别是在春季增加一个新的拦截器:
<mvc:interceptors>
<bean class="edge.portal.vendor.web.interceptor.MultipartAjaxInterceptor"></bean>
</mvc:interceptors>
然后不得不看的拦截试验,如果X-要求,有,然后添加标签,如果我的javascript已标记的呼叫作为阿贾克斯,但头部没有反映这种变化,从而暗示的iframe ajax开机自检:
@Component
public class MultipartAjaxInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
response.getWriter().write("<textarea>");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
response.getWriter().write("</textarea>");
}
}
现在很明显,我跑进问题是,你不能CAL l响应的getWriter或OutputStream不止一次,我觉得我正处在解决这个问题的正确轨道上,但不知道从哪里开始。
我可能最终不得不这样做,我希望我仍然能够使用JsonSerializer,因为它非常有用,但它似乎可能不是一个选项。 – Mark