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