Как: настроить Spring-WS для публикации файлов WSDL с URL-адресом в стиле «? WSDL»? - PullRequest
4 голосов
/ 29 октября 2009

Я пытаюсь настроить прокси веб-службы с помощью Mule ESB.

Я пытаюсь сделать это, используя WSProxyService Mule, но после пошагового выполнения соответствующего кода (с помощью отладчика) становится ясно, что этот класс заменяет адреса конечных точек.

Проблема в том, что WSDL-адреса Spring-WS имеют стиль http://xxxx/xxxx.wsdl,, но WSProxyService ожидает http://xxxx/xxxx?wsdl или http://xxxx/xxxx&wsdl. Он заменяет адреса удаленной конечной точки на локальный адрес WSDL; он обрезает удаленный WSDL-адрес под вопросительным знаком, т. е. «WSDL» предназначен для обрезки, чтобы создать поисковый термин. Но из-за Spring-WS это не работает.

Чтобы разбить его:

WSProxyService пытается использовать

http://xxxx/xxxx.wsdl

заменить

http://xxxx/xxxx

с

http://yyyy/yyyy

, который завершается неудачно ... что приводит к тому, что реальный вызов веб-службы идет напрямую, а не через прокси.

Кто-нибудь когда-нибудь замечал / решал эту проблему ??

Ура, Даррен

Ответы [ 4 ]

3 голосов
/ 18 ноября 2010

Как насчет фильтра сервлетов перед сервлетом Spring WS, который проверяет URL и параметры?

В случае совпадения вы возвращаете WSDL, в противном случае вы пропускаете запрос, как будто ничего не произошло..

Это должно быть тривиально для реализации и заполнит ваши потребности, если вам абсолютно необходимо добавить URL WS ​​+? 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
    }
}
1 голос
/ 05 ноября 2009

Это может быть применимо:

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

Нет, WSDL - это способ получить WSDL класса. В SWS сервис не реализовано как класс.

0 голосов
/ 22 марта 2017

Вы также можете использовать 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() {

    }
}
0 голосов
/ 02 марта 2016

Вы можете создать класс, который реализует Filter, создать метод doFilter, который перехватывает запрос и получить URL-адрес, если он заканчивается на "wsdl", а затем перенаправить запрос на URL-адрес Spring по умолчанию ".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() { }
}
...