# Programm als Webservice laufen lassen



## Kizuna (29. Sep 2011)

Hallo zusammen, 

ich hoffe ersteinmal, dass ich hier im richtigem Forum gelandet bin.

Nachdem ich den ganzen Tag nach Informationen gesucht habe, bin ich jetzt hoffnungslos verwirrt, aber nicht wirklich schlauer...

Zur Zeit habe ich ein Java-Programm geschrieben, was lokal auf meinem Rechner läuft und Eingaben über die Konsole bekommt. Dies läuft auch alles einwandfrei, allerdings möchte ich diese Funktionalität nun über einen Webservice zur Verfgüng stellen.

Da das Initialisieren des Programmes sehr lange dauert, wäre es gut, den Service 1x zu starten und zu initialisieren und dann nur Abfragen an den Service zu stellen. Dabei wäre es mir am liebsten, wenn man die Parameter über die URL übertragen kann, also z.B.

http://localhost:8080/Project/search?string=test

Bisher bin ich jetzt soweit gekommen, dass ich einen Tomcat-Server aufgesetzt habe. Allerdings scheitere ich irgendwie daran, Java-Programme aufzurufen, wenn sie noch weitere jars verwenden).

Kennt jemand vieleicht eine gute Schritt-für-Schritt Anleitung, wie ich vorgehen sollte oder kann mir ein paar Tips geben?

Vielen Dank schon einmal


----------



## Gast2 (29. Sep 2011)

Versteh deine Frage nicht ganz außerdem ist das ganze Netz voll wie man einen WebService in Java schreibt. Du brauchst eine wsdl dazu.
dann gibt es contract first
Chapter*2.*Why Contract First?
contract last findest du bestimmt im netzt genügend 

Enterprise Java Contract-First vs. Contract-Last Web Services - Developer.com
pro4j – Projekte für Java? Experten

WebService in Java

Denk mal das ist ein guter Startpunkt für dich
REST with Java (JAX-RS) using Jersey - Tutorial


----------



## JayGabriel (30. Sep 2011)

Mich hat dieses Tutorial (in Deutsch) schnell weiter gebracht.

Wie du aber Parameter per URL übergeben willst bei einem WebService, ist mir nicht ganz klar. Da müsstest du dann eben googlen, wenn dir hier kein anderer weiter helfen kann.

Auch denk ich, dass du dich erst auch noch in das Thema WebService mehr einlesen solltest, damit du auch verstehst, was gerade passiert.

mfg
Jay


----------



## Kizuna (4. Okt 2011)

Danke ersteinmal für die Tutorials, sie waren sehr hilfreich.

Da ich das Problem hatte, dass das Intiliatisieren meines Programmes sehr lange dauert, bin ich jetzt davon abgegangen, es direkt als Webservice laufen zu lassen, sondern ich habe einen RMI_Server erstellt, der die Initialisierung übernimmt.

Das Ganze sieht etwa so aus:

public class Server {
    public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        System.getSecurityManager().checkListen(1099);
        try {
            String name = "Compute";
            Finder f = new Finder();
            I_Finder stub = (I_Finder) UnicastRemoteObject.exportObject(f, 0);
            Registry registry = LocateRegistry.createRegistry(1099);
            registry.bind(name, stub);
        } catch (Exception e) {
            System.err.println("starting CellFinder server caused exception:");
            e.printStackTrace();
        }
    }
}

public interface I_Finder extends Remote {
	public String search(String arg) throws RemoteException;
}

public class Finder implements I_Finder {
	static int count = 0;	
	public String search(String arg) {
		count++;
		return count + "," + arg;
	}
}

Zum testen habe ich einen kleinen Client erstellt, der sich über die Konsole starten lässt und auf den Server zugreift:

public class Client {	
    public static void main(String args[]) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Compute";
            Registry registry = LocateRegistry.getRegistry("localhost",1099);
            I_Finder f = (I_Finder) registry.lookup(name);            
            String test = f.search("hello world");            
            System.out.println(test);
        } catch (Exception e) {
            System.err.println("ComputePi exception:");
            e.printStackTrace();
        }
    } 
}

Nun möchte ich den Client aber gerne als Webservice laufen lassen. Dabei ergibt sich für mich das Problem, dass ich zum starten des Clients von der Konsole immer noch die Referenz auf ein server.policy -file mit übergebe (java -Djava.security.policy=/Users/server_workspace/Dummy/server.policy  Client).

Ich habe den Client folgendermaßen abgeändert:
@Path("/hello")
public class Client {
	@GET
	@Produces(MediaType.TEXT_PLAIN)
	public String sayPlainTextHello() {		
		return test();}

	public String test(){
		String test = "test";
		if (System.getSecurityManager() == null) {
                System.setSecurityManager(new SecurityManager());
               }

        try {
            String name = "Compute";
            Registry registry = LocateRegistry.getRegistry("localhost",1099);
            I_Finder f = (I_Finder) registry.lookup(name);
            test = f.search("hello world");                   
        }
        return test;
	}
}

Wenn ich diese Applikation auf dem Server laufen lassen, kriege ich folgende Fehlermeldungen:
SCHWERWIEGEND: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container java.security.AccessControlException: access denied (java.util.PropertyPermission * read,write)

SCHWERWIEGEND: Servlet.service() for servlet Jersey REST Service threw exception
java.security.AccessControlException: access denied (java.util.PropertyPermission * read,write)

SCHWERWIEGEND: An exception or error occurred in the container during the request processing
java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader)

Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader)

Ich vermute, dass ich irgendwo im Quellcode den Verweis auf server.policy einbauen muss,  bisher konnte ich aber leider nichts finden.

Hat jemand einen Vorschlag für mich oder bin ich mit meiner Implementierung vieleicht komplett uaf dem Holzweg?

Kizuna


----------



## Gast2 (4. Okt 2011)

He? Warum brauchst du einen RMI Server?

Ich glaub du hast die Tutorials nicht gelesen.


----------



## Hilfssheriff (5. Okt 2011)

Der hat noch genaz andere Sachen nicht gelesen:

JAVA TAGS verwenden bitte.


----------

