Search code examples
web-servicestomcatsoapjax-ws

JAX-WS multiple endpoints Not Found: Invalid Request


I'm trying implement a web service for two endpoints and getting this error "404 Not Found: Invalid Request" when tried accessing the service after deploying onto the apache toncat 8.

Below are my web service implementation classes, sun-jaxws.xml and web.xml

WebImplementation1.java

package com.ws.soap.services;
import javax.jws.WebService;

@WebService(endpointInterface = "com.ws.soap.services.WebServiceImpl1")
public class WebServiceImpl1  {

    public String printMessage() {
        return "Hello from WebServiceImpl1 ";
    }
}

WebServiceImplementation2.java

package com.ws.soap.services;

import javax.jws.WebService;

@WebService(endpointInterface = "com.ws.soap.services.WebServiceImpl2")
public class WebServiceImpl2 {

    public String displayMessage() {
        return "Hello from WebServiceImpl2 ";
    }
}

sun-jaxws.xml

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
    version="2.0">
    <endpoint name="WebServiceImpl1" implementation="com.ws.soap.services.WebServiceImpl1"
        url-pattern="/impl1" />
    <endpoint name="WebServiceImpl2" implementation="com.ws.soap.services.WebServiceImpl2"
        url-pattern="/impl2" />
</endpoints>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>JAX-WS-Tomcat</display-name>
    <listener>
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>sayhello</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>sayhello</servlet-name>
        <url-pattern>/impl1</url-pattern>
        <url-pattern>/impl2</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
</web-app>

Solution

  • Using the exact code supplied (plus the JAX-WS RI jars downloaded from https://jax-ws.java.net/), I was able to create a webapp and successfully access the service endpoints /impl1 and /impl2. Be advised the <url-pattern> and <endpoint ... url-pattern="/impl1"> directives state the resource path to the JAX-WS endpoints within the context path of the enclosing web application.

    So, if the name of the webapp is MyWebServices (MyWebServices.war with no other files/code than described in the post, deployed to Tomcat 8) and you have <url-pattern>/impl1</url-pattern> in web.xml, and with a default Tomcat instance listening on port 8080, your web service endpoint would be http://localhost:800/MyWebServices/impl1 with the WSDL available via http://localhost:800/MyWebServices/impl1?wsdl

    If you want to customize your context path of your webapp (e.g. you don't want /MyWebServices/... you can use the techniques described in this SO question.

    For example, my local Tomcat 8 is running on port 8081:

    enter image description here