Announcement

Collapse
No announcement yet.

Frage zur Benutzung des Java-Serviceloaders

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zur Benutzung des Java-Serviceloaders

    Ich habe eine besonderes Problem (und die Frageist bestimmt ein bisschen doof) – ich habe gerade versucht, den Serviceloadermechanismus in einem JAV-EE Projkt in einer kleinen Anwendung zu testen, allerdings verstehe ich noch nicht ganz, wie ich das richtig bewerkstelligen sollte. Ich habe also folgendes gemacht:

    Ich habe zwei Packages angelegt, core und services. In dem Package core befinden sich folgende Klassen:

    Code:
    package core;
    
    import java.io.*;
    
    import services.DispatcherService;
    import services.DispatcherServiceImpl;
    
    public class Main {
    
    	
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    
    DispatcherServiceImpl dsp = (DispatcherServiceImpl) Locator.locate(DispatcherService.class);
    		
    		dsp.setMsg(new Message());
    		
    
    	}
    
    }
    Code:
    package core;
    
    import java.util.ServiceLoader;
    
    public class Locator {
    
    	  public static <T> T locate(Class<T> service) {
    		  
    	        T result = null;
    	 
    	        ServiceLoader<T> impl = ServiceLoader.load(service);
    	 
    	        for (T loadedImpl : impl) {
    	            result = loadedImpl;
    	            if ( result != null ) break;
    	        }
    	 
    	        if ( result == null ) throw new RuntimeException(
    	            "Cannot find implementation for: " + service);
    	 
    	        return result;
    	  }
    	
    }
    Code:
    package core;
    
    public class Message {
    
    	private String txt = "HELLO";
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((txt == null) ? 0 : txt.hashCode());
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Message other = (Message) obj;
    		if (txt == null) {
    			if (other.txt != null)
    				return false;
    		} else if (!txt.equals(other.txt))
    			return false;
    		return true;
    	}
    
    	@Override
    	public String toString() {
    		return "Message [txt=" + txt + "]";
    	}
    
     
    	
    	
    }
    Im Package services befinden sich folgende Klassen:

    Code:
    package services;
    
    import java.util.List;
    
    import core.Message;
    
    
    public interface DispatcherService{
    
    	 public Message getMsg();
    	 
    	 public void  setMsg(Message m);
    	  
    }
    Code:
    package services;
    
    import core.Message;
    
    
    public class DispatcherServiceImpl implements DispatcherService{
    
    public DispatcherServiceImpl(){};
    	
    public Message mMessage;
    
    	@Override
    	public Message getMsg() {
    		return mMessage;
    	}
    
    	@Override
    	public void setMsg(Message m) {
    		mMessage = m;
    		
    	}
    
    }
    Ich habe in dem Ordner META-INF eine datei mit dem Namen des Service-Interfaces angelegt, der da lautet services.DispatcherService, und diese Datei enthält folgenden String als Inhalt:

    services.DispatcherServiceImpl


    Es heißt aber in der Anleitung nun, dass man aus „dem Ganzen“ eine jar machen muss – ich habe also die Anwendung als jar exportiert, und dann als externe jar in derselben Anwendung referenziert (was ich zeimlich komisch finde, aber irgendwie meine ich das der Anleitung zu entnehmen). Wenn ich das ganze nun auf meinem Tomcat laufen lasse, tut sich nix. Ich frage mich, bei welchem Schritt der Fehler ist.

  • #2
    Etwas, das eine Klasse mit einer main-Funktion hat, wird auf keinem Webserver laufen. Tomcat will eine Webanwendung mit einer web.xml
    Christian

    Comment

    Working...
    X