代码之家  ›  专栏  ›  技术社区  ›  Darren Bishop

如何:配置Spring WS以用''发布WSDL文件?WSDL样式的URL?

  •  4
  • Darren Bishop  · 技术社区  · 15 年前

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

    我正试图使用Mule的WSProxyService来实现这一点,但是在遍历了相应的代码(使用调试器)之后,很明显这个类替换了端点地址。

    http://xxxx/xxxx.wsdl ,但WSProxyService需要 http://xxxx/xxxx?wsdl http://xxxx/xxxx&wsdl . 它用本地WSDL地址替换远程端点地址;它在问号处剪切远程WSDL地址,即?WSDL'是要被切掉的,所以要创建搜索项。但是由于Spring WS,这不起作用。

    要分解它:

    http://xxxx/xxxx.wsdl
    

    替换

    http://xxxx/xxxx
    

    具有

    http://yyyy/yyyy
    

    有人注意到/解决过这个问题吗??

    4 回复  |  直到 15 年前
        1
  •  3
  •   Axel Fontaine    14 年前

    在springwservlet前面的一个servlet过滤器检查url和参数如何?

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

    代码如下:

    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
        }
    }
    
        2
  •  1
  •   Dave    15 年前

    这可能适用于:

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

    属于一个阶级。在SWS中,服务不是

        3
  •  0
  •   jlucasps    9 年前

    您可以创建一个实现 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() { }
    }
    
        4
  •  0
  •   Peter Knuts    8 年前

    您还可以使用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() {
    
        }
    }