Javadroider
Javadroider

Reputation: 2450

WSDL (dot) vs. (question mark) notation in SpringBoot WS

I'm using Spring Boot 2.0.1 to build a contract first web service.

I followed Spring-boot sample examples -

https://spring.io/guides/gs/producing-web-service/.

And this worked fine.

My wsdl is now located at

http://localhost:8080/ws/countries.wsdl 

Problem is that the application that will be the consumer of this web service requires the wsdl url to be written as

http://localhost:8080/ws/countries?wsdl

As per post I integrated turkey UrlRewriteFilter How to use Tuckey urlrewrite in spring boot to access service using ?wsdl

But, URL rewriting is not happening as expected. My urlrewrite.xml looks like this. From logs I found out that it is taking xml file but not doing url rewrite. Where am I going wrong?

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite
        PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
        "http://www.tuckey.org/res/dtds/urlrewrite3.0.dtd">

<urlrewrite>
    <rule>
        <from>/countries?wsdl</from>
        <to>/countries.wsdl</to>
    </rule>
</urlrewrite>

Upvotes: 2

Views: 2371

Answers (1)

Javadroider
Javadroider

Reputation: 2450

I found best solution.Write your own filter as follows.You can make use of HttpServletRequestWrapper to handle the ?wsdl extension and let the server handle the request.

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;

@Component
public class WSDLQuestionMarkReplaceFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //put init logs
    }

    @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() {
        //put destroy logs
    }
}

Upvotes: 9

Related Questions