2016-03-23 2 views
0

Ich verwende deadbolt 2.5.0 und ich habe benutzerdefinierte SubjectPresentHandler erstellt wie folgt:Deadbolt 2.5.0, nicht in der Lage kundenspezifische SubjectPresentHandler AbstractDeadboltHandler erstreckt instanziiert

public class SubjectPresentHandler extends AbstractDeadboltHandler 
{ 
    public SubjectPresentHandler(ExecutionContextProvider ecProvider) { 
     super(ecProvider); 
    } 
    // other required methods 
} 

Und ich habe auch:

@Singleton 
public class CustomDeadboltHandlerCache implements HandlerCache 
{ 
    private final DeadboltHandler defaultHandler = new SubjectPresentHandler(); 
    // other required code 
} 

Das Problem, das ich hier habe, ist, dass ich SubjectPresentHandler nicht mit seinem Standardkonstruktor instanziieren kann. Ich erhalte einen Fehler wie: "Der Konstruktor SubjectPresentHandler ist nicht definiert". Nun, wenn ich hinzufügen Standardkonstruktors in SubjectPresentHandler wie folgt:

public SubjectPresentHandler() { 
    super(); 
} 

Ich erhalte eine Fehlermeldung wie: Der Konstruktor AbstractDeadboltHandler nicht definiert ist. Wenn ich den paramaterized Konstruktor in SubjectPresentHandler versuchen zu entfernen, dann erhalte ich Fehlermeldung als

"Implicit super constructor AbstractDeadboltHandler() is undefined for default constructor. Must define an explicit constructor". 

Ich bin nicht sicher, wie ich dieses Problem lösen kann, so sucht Lösung zu diesem Problem.

Antwort

1

Der Konstruktor von SubjectPresentHandler benötigt einen ExecutionContextProvider als Parameter. Der einfachste Weg, dies zu tun, ist es, einen zu injizieren und die Erstellung des Handlers über Guice durchzuführen.

Der ExecutionContextProvider wird von DeadboltModule zur Verfügung gestellt - Sie können dies here sehen.

@Singleton 
public class SubjectPresentHandler extends AbstractDeadboltHandler 
{ 
    @Inject 
    public SubjectPresentHandler(ExecutionContextProvider ecProvider) { 
     super(ecProvider); 
    } 
    // other required methods 
} 

Sie können auch den Handler in den Handler Cache injizieren:

@Singleton 
public class CustomDeadboltHandlerCache implements HandlerCache 
{ 
    private final DeadboltHandler defaultHandler; 

    @Inject 
    public CustomDeadboltHandlerCache(final DeadboltHandler defaultHandler) { 
     this.defaultHandler = defaultHandler; 
    } 
    // other required code 
} 

Wenn Sie mehrere Handler haben, werfen Sie einen Blick auf the documentation dafür, wie diese zu behandeln.

+0

@stevechalober: Dies behebt das Problem nicht, auch wenn ich SubjectPresentHandler in CustomDeadboltHandlerCache injiziere, beschweren sich die Compiler für Standardkonstruktor in SubjectPresentHandler, der in unserem Fall nicht vorhanden ist, und wie ich erwähnt kann ich Standardkonstruktor in SubjectPresentHandler nicht hinzufügen . – Programmer

+0

Hier eine Beispielimplementierung: https://github.com/schaloner/deadbolt-2-java/blob/master/test-app/app/be/objectify/deadbolt/java/test/security/MyDeadboltHandler.java –

+0

@stevechalober : Auch Ihr Beispiel hat keinen Standardkonstruktor, bin mir nicht sicher, wie das in Ihrem Fall funktioniert. Unten sind die Änderungen, die ich in meinem Code vorgenommen habe, aber Compiler winkt für Standardkonstruktor in SubjectPresentHandler. Ich habe Änderungen in CustomDeadboltHandlerCache vorgenommen, wie Sie vorgeschlagen haben, siehe Änderungen. – Programmer