Reputation: 1092
I am implementing a SOAP
web service in GAE
. Since GAE
does not support JAX-WS
I have chosen to go this way, which is basically building the soap requests and responses myself from a servlet.
Everything works fine but how can I achieve to return the wsdl description in http://myurl/MyService?wsdl
?
I guess I must implement the GET
method of my servlet but how?
Upvotes: 2
Views: 1961
Reputation: 427
I have enclosed a working implementation. Note that it's based on Servlet 3.0 spec. If you are using 2.5, the annotations wont work.
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name="MyWSServlet", urlPatterns={"/MyService"})
public class MyWSServlet extends HttpServlet {
private static final long serialVersionUID = 3605874163075522777L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
boolean requestForWSDL = false;
Enumeration<String> params = req.getParameterNames();
while (params.hasMoreElements()) {
if ("wsdl".equalsIgnoreCase(params.nextElement())) {
requestForWSDL = true;
}
}
if (requestForWSDL) {
FileInputStream wsdlInputStream = new FileInputStream(req.getServletContext().getRealPath("/wsdl/TemperatureService.wsdl"));
byte[] buffer = new byte[1024];
resp.setContentType("application/xml");
int bytesRead = 0;
while ((bytesRead = wsdlInputStream.read(buffer)) != -1) {
resp.getOutputStream().write(buffer, 0, bytesRead);
}
wsdlInputStream.close();
resp.getOutputStream().flush();
}
}
}
Upvotes: 2