Я пытаюсь найти обходной путь для ужасной ошибки 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?