Google Guice (Assisted Injects) - Buggy oder mach ich's falsch?

Mujahiddin

Top Contributor
Hallo, ich versuche mich gerade an einem kleinen Programm und verwende dafür Google Guice.
Beim Programm soll der Benutzer seinen Namen und Passwort eingeben und da diese erst zur Laufzeit bekannt sind, verwende ich für diese Implementierung AssistedInject.
Ich habe hierfür ein Interface UserFactory mit der Methode
Code:
User create(@Assisted("Username") String username, @Assisted("Password") String password);
Am Anfang des Programms wird dieser User einmalig initialisiert mittels:
Java:
User user = getInjector().getInstance( UserFactory.class ).create( username, password );
und in den folgenden Programmabschnitten will ich auf diese Instanz zugreifen. Dafür habe ich den Scope bereits auf Singleton gesetzt.
Das Problem ist aber, dass ich dauernd Fehlermeldungen kriege. Guice meckert, dass ich keine Variablen übergeben habe. Und wenn ich in die configure-Methode
Code:
bind( User.class ).in( Singleton.class );
mache, kommt ein Fehler, dass es keine Deklaration für die Annotation "Assisted" gibt (Es ist ja immerhin so, dass man vor Parametern eine Annotation setzen kann, um diese eindeutig zu identifizieren. Diesen müssen im Injector eine Dependency gegeben werden.)

Ich werde evtl ein KSKB posten. Weiß jemand aber, wie man das umgehen kann?

Edit: Ich verwende Guice 3.0,

hier mal das KSKB:

Java:
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Singleton;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.FactoryModuleBuilder;


public class KSKB {
	
	@Singleton
	public static class User {
		
		public final String	name;
		
		@Inject
		public User(@Assisted("Username") String username) {
			this.name = username;
		}
		
		public static interface Factory {
			
			public User create(@Assisted("Username") String username);
		}
	}
	
	public static void main(String... args) {
		Injector injector = Guice.createInjector( new AbstractModule() {
			
			@Override
			protected void configure() {
				install( new FactoryModuleBuilder().build( User.Factory.class ) );
//				bind( User.class );
			}
			
		} );
		User user = injector.getInstance( User.Factory.class ).create( "Guice" );
		System.out.println( user.name );
		
//		user = injector.getInstance( User.class ); // doesn't work - throws Exception!!
//		System.out.println( user.name );
	}
}

Die auskommentierten Stellen erzeugen den Fehler. Vor allem die letzten 2 Zeilen Code leuchten mir einfach nicht ein!
 
Zuletzt bearbeitet:

Landei

Top Contributor
Ich glaube mal irgendwo gelesen zu haben, dass Guice keine inneren Klassen unterstützt (keine Ahnung, ob das noch aktuell ist). Außerdem: Wenn bei dir alle Konstruktorparameter "assisted" sind, wozu bauchst du dann überhaupt eine Injection?
 

Mujahiddin

Top Contributor
1. sind das verschachtelte Klassen und 2. ist das nur ein KSKB und deshalb sind sie verschachtelt. Bei meinem Programm sind das eigene Dateien und somit eigene Klassen.

Was soll ich denn sonst tun, wenn nicht Injection? Ganz auf Guice verzichten?
 
T

Tomate_Salat

Gast
Wozu AssistedInjection? Ich sehe keine Notwendigkeit für ein Singelton ein FactoryPattern zu verwenden. Wieso muss der Name schon beim erstellen des Objektes bekannt sein? Würde ein Feld mit Getter/Setter nicht reichen, dass du dann an entsprechender Stelle setzt.
 

Mujahiddin

Top Contributor
Ich habe das Problem auf eine andere Weise gelöst, und zwar mit einer Klasse
Code:
UserManager
.
Diese Vorgehensweise ist sehr praktisch für mein Vorhaben, ich habe nämlich mehrere Benutzer, die in einer Liste gespeichert sind und die an einen Thread zugewiesen werden, welcher sich um die Kommunikation kümmert.
Der
Code:
UserManager
ist ein Singleton und hat Methoden zum Erstellen eines Benutzers (also einmalig vor dem Übergeben an den Thread) und Methoden, um einen Benutzer anhand des Namens / des Sockets zu identifizieren.

Allerdings gibt es während der ganzen Laufzeit meines Servers (welcher Useranfragen empfängt) eine Verbindung zur Datenbank und die muss mit einer Eingabe aus DB-Username und Passwort initiiert werden. Hier bin ich so vorgegangen, dass das
Code:
ConnectionModule
beim Konstruieren diese zwei Werte erwartet. Sobald in der Klasse
Code:
DatabaseConnectionService implements ConnectionService
die Verbindung hergestellt wird, wird das Passwort aus dem char-Array gelöscht. DatabaseConnectionService ist hierbei ein Singleton.

Die Hilfe kam aus einem Thread der Seite StackOverflow - Hier der Link zur Frage:
java - Output of "Assisted" factory should be @Singleton - Stack Overflow
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Compiler-Fehler Google Guice Module zur Laufzeit zusammenstellen und binden Allgemeine Java-Themen 4
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
DamienX Google Guice AOP + Logging Allgemeine Java-Themen 3
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
T Google Links in einer Liste Allgemeine Java-Themen 4
G Google-Suche ist nicht auslesbar?! Allgemeine Java-Themen 18
I Java google Sandbox benutzen Allgemeine Java-Themen 1
X Lotto - google caliper Benchmark Allgemeine Java-Themen 4
T Google Distance Matrix API Hello World/ Client Secret Allgemeine Java-Themen 3
T Google Maps API nächste Person Allgemeine Java-Themen 5
T Google OAuth 2.0 aber wie Allgemeine Java-Themen 16
F Über Java Google Suche nutzen Allgemeine Java-Themen 11
M Google App Engine macht Probleme Allgemeine Java-Themen 4
yvesdaeschle Google Spreadsheet Allgemeine Java-Themen 6
M google plus java api - Anfänger sucht Hilfe Allgemeine Java-Themen 7
M GWT Project nur in Google Chrome sichtbar Allgemeine Java-Themen 7
L Java und Javascript um Distanz über Google Maps zu berchnen Allgemeine Java-Themen 10
S Frage: Google Maps "Map" in Java Allgemeine Java-Themen 3
M Google API Allgemeine Java-Themen 6
algorismi Google maps in Java Swing Allgemeine Java-Themen 2
P Google Abfrage auslesen Allgemeine Java-Themen 2
FoolMoon API für Google Suchergebnisse? Allgemeine Java-Themen 23
Pfirsich Java + Begriff = Pos + Domain (Google API) !!! Allgemeine Java-Themen 14
M Google Maps mit Java Allgemeine Java-Themen 5
B Regex -> Bspw. _NUR_ GOOGLE.de Allgemeine Java-Themen 7
R Google Keyword Position Allgemeine Java-Themen 11
R Wie Google & Co mit Java nutzen? Allgemeine Java-Themen 16
J Bitte um Kurzinfo bez. JMF (ja, war bei Forumssuche/google) Allgemeine Java-Themen 2
Y Google Map + JSP Tag Libary Allgemeine Java-Themen 2
N google maps api mit javaserver faces Allgemeine Java-Themen 5
C Server-Zahl von google.com Allgemeine Java-Themen 11
L Guice Dependency Injection Allgemeine Java-Themen 0
I WebSockets mit Jersey und Guice Allgemeine Java-Themen 0
T GUICE- Dependency Injection- WANN nutze ich Providers? Allgemeine Java-Themen 2
N Guice - Ohne injector.getInstance Allgemeine Java-Themen 2
F rekursiver Aufruf (Sudoku und Guice) Allgemeine Java-Themen 19
Landei Guice - Injection von "zwischendurch" erzeugten Objekten Allgemeine Java-Themen 4
F DI @SesionScoped Guice Allgemeine Java-Themen 4
Jay_030 Guice + Hibernate = Probleme? Allgemeine Java-Themen 2
Jay_030 Guice: Injector übergeben? Allgemeine Java-Themen 3
Jay_030 Guice: Frage im Umgang mit Unit-Tests Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben