Reputation: 2450
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
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