7

我正在尝试使用 Mule ESB 配置 Web 服务代理。

我正在尝试使用 Mule 的 WSProxyService 来执行此操作,但是在单步执行相应的代码(使用调试器)之后,很明显这个类替换了端点地址。

问题是 Spring-WS WSDL 地址的样式为http://xxxx/xxxx.wsdl,但 WSProxyService 需要http://xxxx/xxxx?wsdlhttp://xxxx/xxxx&wsdl。它将远程端点地址替换为本地 WSDL 地址;它在问号处切断远程 WSDL 地址,即“?WSDL”旨在被切断,以便创建搜索词。但是由于 Spring-WS,这不起作用。

分解它:

WSProxyService 最终尝试使用

http://xxxx/xxxx.wsdl

取代

http://xxxx/xxxx

http://yyyy/yyyy

失败了...导致实际的 Web 服务调用直接而不是通过代理。

有没有人注意到/解决了这个问题?

干杯,达伦

4

4 回答 4

5

在检查 url 和参数的 Spring WS servlet 前面的 servlet 过滤器怎么样?

如果匹配,则返回 WSDL,否则让请求通过,就好像什么都没发生一样。

如果您绝对必须附加 WS + ?WSDL 的 url,这应该很容易实现并且可以满足您的需求。

这是代码:

public class WsdlQueryCompatibilityFilter implements Filter {
    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
        // do nothing
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
            throws IOException, ServletException {
        final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        if ("GET".equals(httpServletRequest.getMethod())
                && "wsdl".equalsIgnoreCase(httpServletRequest.getQueryString())) {
            httpServletRequest.getSession().getServletContext().getRequestDispatcher("/ws.wsdl")
                    .forward(request, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        // do nothing
    }
}
于 2010-11-18T13:42:24.533 回答
1

这可能适用:

http://forum.springsource.org/showpost.php?p=101967&postcount=4

不, ?WSDL 是一种获取类的 WSDL 的方法。在 SWS 中,服务不是作为类实现的。

于 2009-11-05T16:50:42.233 回答
1

您还可以使用 HttpServletRequestWrapper 来处理 ?wsdl 扩展并让服务器处理请求:

@Component
public class WsdlQuestionMarkSuffixFilter implements javax.servlet.Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        if ("wsdl".equalsIgnoreCase(httpRequest.getQueryString())) {
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {
                @Override
                public String getQueryString() {
                    return null;
                }

                @Override
                public String getRequestURI() {
                    return super.getRequestURI() + ".wsdl";
                }
            };
            chain.doFilter(requestWrapper, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {

    }
}
于 2017-03-22T10:33:25.567 回答
0

您可以创建一个实现的类Filter,创建doFilter拦截请求并获取以 结尾的 URL 的方法"wsdl",然后将请求转发到 Spring 默认 URL 以".wsdl"清理查询字符串。像这样的东西:

@Component
public class QuestionMarkFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        if (request.getQueryString() != null && request.getQueryString().toLowerCase().endsWith("wsdl")) {
            request.getRequestDispatcher("/your/service/here.wsdl?").forward(request, servletResponse);
        } else {
            chain.doFilter(servletRequest, servletResponse);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) { }

    @Override
    public void destroy() { }
}
于 2016-03-02T02:49:58.223 回答