Spring MVC アノテーション駆動型プロジェクトがあり、うまく機能しています。この時点で、私のフォームの多くは小さく、Ajax リクエストを使用してそれらを処理する傾向がありました。私はこのプラグインを使用しています: http://jquery.malsup.com/form/ Ajax リクエストを処理し、それもうまく機能しています。しかし、私は問題に遭遇しました。Jackson を使用して @ResponseBody アイテムを json にシリアル化しています。うまく機能しましたが、ファイルをアップロードする必要がある最初のフォームに遭遇しました。AjaxForm は、iframe 送信トリックを使用して古いブラウザーでこれを処理しますが、応答を<textarea></textarea>
すべての情報が確実に届くようにするためです。私は狂ったように見回しており、オブジェクトのカスタムシリアライザーを作成できることがわかりましたが、リクエストタイプがそうであるかどうかを確認してから、レスポンスをタグXHR
で囲む方法を考えられません。<textarea></textarea>
何か案は?
これが私のコードの一部です:
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;
}
前もって感謝します!
更新- 具体的にはSpringに新しいインターセプターを追加することで、問題を修正したとほとんど思っていました。
<mvc:interceptors>
<bean class="edge.portal.vendor.web.interceptor.MultipartAjaxInterceptor"></bean>
</mvc:interceptors>
次に、インターセプター テストで X-Requested-with かどうかを確認し、javascript が呼び出しに Ajax のフラグを立てたが、ヘッダーにこの変更が反映されていない場合はタグを追加し、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>");
}
}
明らかに、私が遭遇した問題は、応答の getWriter または OutputStream を複数回呼び出すことができないということです。これを解決するための正しい軌道に乗っているように感じますが、ここからどこに行くべきかわかりません。