Фильтр сервлетов для веб-службы ColdFusion SOAP работает для WSDL, но не работает при запросах SOAP - PullRequest
2 голосов
/ 05 августа 2011

Я пытаюсь найти обходной путь для ужасной ошибки ColdFusion , которая приводит к тому, что мой веб-сервис SOAP возвращает противоречивые результаты. То, что я хочу сделать, это заменить «remote_api.tafkan» на «remote_api» при выводе любого вызова CFC.

Я создал фильтр сервлетов Java для этого, и он работает, когда я вызываю WSDL, но он прерывается, когда я выполняю SOAP-вызов одного из методов службы.

Вот код моего фильтра:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public final class PFAPICorrector implements Filter {
  private FilterConfig filterConfig = null;
  public void init(FilterConfig filterConfig) 
    throws ServletException {
    this.filterConfig = filterConfig;
  }
  public void destroy() {
    this.filterConfig = null;
  }
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    throws IOException, ServletException {

    CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response);
    chain.doFilter(request, wrapper);

    System.out.println("ORIGINAL (" + wrapper.toString().length() + "): " + wrapper.toString());

    String correctedResponse = wrapper.toString().replace("remote_api.tafkan", "remote_api");
    response.setContentLength(correctedResponse.length());

    System.out.println("CORRECTED (" + correctedResponse.length() + "): " + correctedResponse);

    PrintWriter out = response.getWriter();
    out.write(correctedResponse);
    out.close();
  }
}

Как я уже говорил, вызов WSDL, который включает в себя вызывающую ошибку строку "remote_api.tafkan" в своей wsdl: документации, приводит к правильно отфильтрованным выводам, а операторы отладки ORIGINAL и CORRECTED выводят ожидаемое содержимое.

Однако, когда я делаю SOAP-запрос (используя SoapUI) к одному из методов, описанных WSDL, фильтрация не работает (строка не заменяется), и в моем журнале CF я получаю следующее:

ORIGINAL (0): 
CORRECTED (0): 
08/05 11:00:11 error 
java.lang.IllegalStateException
    at jrun.servlet.JRunResponse.getWriter(JRunResponse.java:198)
    at PFAPICorrector.doFilter(PFAPICorrector.java:51)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
    at jrun.servlet.FilterChain.service(FilterChain.java:101)
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:249)
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

Похоже, что один из фильтров, предшествующих моему, выводит ответ SOAP и завершает цепочку фильтров, поэтому мой фильтр никогда не видит ответ, отсюда и отсутствие данных в ORIGINAL в моем отладочном выводе. (Возможно, я столкнулся с этой проблемой , но исправление там ничего не изменило.)

Не имея возможности увидеть, что происходит внутри сервлетов и фильтров ColdFusion, как я могу изменить ответ SOAP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...