In-process SOAP service server for Java

14,505

Solution 1

Seems jdk 6.0 already comes with a jax-ws implementation, and a little server you can embed. I havn't figured out all the pieces but here's a start:

mkdir -p helloservice/endpoint/

helloservice/endpoint/Hello.java :

package helloservice.endpoint;

import javax.jws.WebService;

@WebService()
public class Hello {
  private String message = new String("Hello, ");

  public void Hello() {}

  public String sayHello(String name) {
    return message + name + ".";
  }
}

helloservice/endpoint/Server.java:

package helloservice.endpoint;
import javax.xml.ws.Endpoint;

public class Server {

    protected Server() throws Exception {
        System.out.println("Starting Server");
        Object implementor = new Hello();
        String address = "http://localhost:9000/SoapContext/SoapPort";
        Endpoint.publish(address, implementor);
    }

    public static void main(String args[]) throws Exception {
        new Server();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}

Build the thing:

mkdir build
javac -d build helloservice/endpoint/*java
$JAVA_HOME/wsgen -d build -s build -classpath .  helloservice.endpoint.Hello

Run the thing:

java -cp  build helloservice.endpoint.Server

Somethings running on http://localhost:9000/SoapContext/SoapPort now. You can get the wsdl on http://localhost:9000/SoapContext/SoapPort?WSDL

Havn't gotten around to making a client yet..

Solution 2

In addition to nos's great answer, I found a class in Apache axis called SimpleHTTPServer which I'm pretty sure does the same thing but only requires Java 1.5 for those of you stuck with 1.5

I'm not going to explore it since I'm going to use the other solution, so I haven't actually verified it does what I think it does, but I'm pretty sure it does.

Solution 3

Most(/all?) Java SOAP server implementations provide a Servlet (the javax.xml.ws.Endpoint approach in another answer does look a bit simpler though...). Some SOAP implementations you could consider are: Apache CXF: cxf.apache.org, Apache Axis2: ws.apache.org/axis2/ or Spring Web Servies: static.springsource.org/spring-ws/site/ .

The most popular embedded Java web server seems to be Jetty, you can configure it either programatically (using plain Java or Spring beans) or using a custom XML format.

Share:
14,505

Related videos on Youtube

tster
Author by

tster

All code I post is licensed by the WTFNMFPL-1.0 (see: https://tldrlegal.com/license/do-what-the-fuck-you-want-to-but-it's-not-my-fault-public-license-v1-(wtfnmfpl-1.0)#fulltext). Do what the fuck you want to with it.

Updated on April 21, 2020

Comments

  • tster
    tster about 4 years

    OK, I am developing a program which will be deployed to lots of machines (Windows, Linux, AIX, z/Linux, openVMS, etc.). I want that application to contain a SOAP web service, but I don't want to bundle tomcat or run a separate service for the services (I want them in the same process as the rest of the application).

    Basically what I'm looking for is something where I can define a class (say WebServices). I'm OK with writing WSDL or any other kind of service description as well. The I want something like this:

    SOAPServer server = makeMeASoapServer();
    //do config on the server
    server.add(new WebService(...));
    server.listen(port);
    

    Obviously the names and parameters will be different.

    I've been looking at Axis, and it seems like it provides this, but I don't know what classes I need to use. Am I crazy in wanting this kind of behavior? I can't believe more people aren't looking for this, I do this all the time with embedded web services within .NET clients.

    • Dean J
      Dean J over 14 years
      I read this as programmatically loading different services on the server for external clients to be able to call. I'd still do that in a config file, though, instead of quite like that.
  • tster
    tster over 14 years
    This is EXACTLY what I wanted. Thank you so much
  • tster
    tster over 14 years
    As an added bonus, this comes in the jax-ws project (part of Glassfish) and only requires Java 5. You cane download the releases here: jax-ws.dev.java.net
  • nos
    nos over 14 years
    Seems you don't even need that if you're on suns jdk 6
  • skaffman
    skaffman over 14 years
    There's also Jetty (mortbay.org/jetty) which can be run in embedded mode.
  • sixtyfootersdude
    sixtyfootersdude over 14 years
    I think the wsgen command should be: wsgen -d build -s build/ -classpath build/ helloservice.endpoint.Hello
  • sixtyfootersdude
    sixtyfootersdude over 14 years
    When I go to the first URL I just get this text: "Web Services No JAX-WS context information available." Anyone getting the same thing? Is that what is supposed to be displayed? I am not sure... The second URL displays xml.. as expected.
  • Marcus Junius Brutus
    Marcus Junius Brutus over 10 years
    If I understand correctly that corresponds to a bottom-up web service when you implement the method in Java and get the WSDL out of it. Can you do the same in a top-down method (i.e. start with an WSDL) that runs in-process, using standard JDK ?
  • nos
    nos over 10 years
    @MarcusJuniusBrutus Yes, the wsimport tool (as opposed to the wsgen tool used here) goes the other way.
  • Marcus Junius Brutus
    Marcus Junius Brutus over 10 years
    @nos Building upon your answer, I experimented on the client side (again, from a standalone Java application perspective): stackoverflow.com/questions/18925888/…