2014-02-06 12 views
9

kehrt Ich mag würde konstante String-Nachricht an Managed Bean in JSF Web-Anwendung injizieren CDI verwendet wird, hier ist Produzent Klasse:Inject Producer-Methode, die String CDI

@Named 
@RequestScoped 
public class StringProducer { 

    @Produces 
    @Named("message")  
    @RequestScoped 
    public String getMessage() { 
     return "Hello World"; 
    } 
} 

und hier ist, wie es in anderen verwalteten injiziert wird Bohne:

@Inject Named("message") String message; 

aber das Ergebnis ist immer in Ausnahme:

org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435 Normal scoped bean int is not proxyable 

I tr Der String-Typ innerhalb der Instanz wie folgt umbrechen:

@Inject Named("message") Instance<String> message; 

aber nichts geändert.

+0

16 Stunden vergangen, ohne irgendwelche Antworten .... –

+0

Seien Sie nicht aufdringlich. Niemand hier hat Anspruch auf blitzschnelle Antworten. Außerdem war die Lösung für dein Problem in dem verdammten Handbuch. – jpangamarca

Antwort

7

Das Problem ist Ihre Verwendung der @RequestScoped Annotation auf der Producer-Methode. Entfernen Sie es und die Anwendung wird wie erwartet funktionieren.

Die Request Scoped Annotation wird verwendet, um zu kommentieren Bohnen verwaltet durch den Container. Zu diesem Zweck gibt der Container die öffentlichen Methoden des Objekts weiter. Abschlussklassen wie String sind jedoch nicht proxyable, wie die Ausnahme wies darauf hin, wenn Sie den Code auf Glassfish 4.0 mit Weld 2.0.0 SP1 ausgeführt wird:

WELD-001437 Normal scoped bean class java.lang.String is not proxyable because the type is final or it contains a final method class java.lang.String - Producer Method [String] (...etc.) 
+0

danke, es funktioniert jetzt! –

4

Nur kurze Informationen für zukünftige Leser:

Neben die vier integrierten in Scopes, CDI unterstützt auch zwei pseudo-Bereiche:

  1. @Singleton
  2. @Dependent

und beide über Pseudo-Bereiche haben interessante Feature: CDI erstellt kein Proxy-Objekt für sie.

So alle Klassen, die nicht proxyable (beispielsweise aufgrund endgültig oder wegen des Mangels an nicht argument öffentlichen Konstruktor ist) kann mit @Singleton oder @Dependent markiert werden - natürlich nur, wenn es Sinn macht.