JSF Growl Message an User senden

OnDemand

Top Contributor
Hi,

ich möchte, dass ich auch aus der Geschäftslogik her eine Growl Message senden kann.
Ich habe mir daher folgende Klasse geschrieben:

Java:
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class MessageManager {
    
    

    public static void sendMessage(String message){
	FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, message, message);  
	FacesContext.getCurrentInstance().addMessage(null, msg);
    }


}

Der Aufruf klappt auch super aus der View her:
HTML:
<p:commandButton value="Login" update="growl"
					action="#{messageManager.sendMessage('Blabla')}" />


Aber wenn ich die Methode zb so hier aufrufe, kommt ne Nullpointer:
Java:
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {

	HttpServletRequest req = (HttpServletRequest) request;
	HttpSession session = ((HttpServletRequest) req).getSession(false);

	if (session == null) {
	    String contextPath = ((HttpServletRequest) req).getContextPath();
	    ((HttpServletResponse) response).sendRedirect(contextPath + "/login.xhtml");

	} else if (session.getAttribute("loggedIn") == null) {
	    String contextPath = ((HttpServletRequest) req).getContextPath();
	    ((HttpServletResponse) response).sendRedirect(contextPath + "/login.xhtml");
	} else {
	    MessageManager man = new MessageManager();
	    man.sendMessage("dfsljgfkj");
	    chain.doFilter(request, response);
	}
    }

Ist das machbar, dass ich die Methode auch aus anderen Methoden aufrufen kann ohne dass es einer Action vom User Bedarf? Irgendwie hab ich grad n Brett vorm Kopf...
 

stg

Top Contributor
Du bist doch schon eine ganze Weile hier ... da solltest du doch wissen, dass es immer hilfreich ist, wenn du den StackTrace der Exception postest, damit man den Fehler schneller/leichter finden kann!
 

OnDemand

Top Contributor
Morgen Stack:
Code:
Feb 27, 2015 9:34:17 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/app] threw exception
java.lang.NullPointerException
	at com.domain.util.messages.MessageManager.sendMessage(MessageManager.java:14)

Betrifft die 3. Zeile in folgender Methode:

Java:
public void sendMessage(String message){
	FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, message, message);  
	FacesContext.getCurrentInstance().addMessage(null, msg);
    }
 
Zuletzt bearbeitet:

stg

Top Contributor
So, hab gerade mal ein wenig Zeit mir das genauer anzuschauen. Offenbar hast du einen eigenen Web-Filter geschrieben. Die Filter liegen nun aber im ServletContext, außerhalb von FacesContext, daher kannst du hier nicht direkt auf den FacsContext zugreifen. Das Resultat ist, dass FacesContext.getCurrentInstance() hier null zurückgibt, was deine NPE erklärt.
Du hast nun zwei Möglichkeiten. Entweder du erstellst und setzt den FacesContext von Hand selbst, oder aber, und das ist vermutlich die sinnvollere Variante: Du überlegst, ob ein Filter hier tatsächlih das ist, was du wirklich brauchst, und ob du stattdessen nicht besser einen PhaseListener o.Ä. einsetzt.
 

OnDemand

Top Contributor
Moin, danke dir für dein Prüfen!

Der Filter an der Stelle, prüft ob der User berechtigt ist den Bereich /private zu betreten. Also ist er schon wichtig. Dann lass ich mir was anderes einfallen wie ich dem User Informationen zukommen lasse. Ein Dialog wäre blöd, weil er da bestätigen muss. Gibts ne alternative?

Folgendes hatte ich probiert:

Java:
import javax.faces.FactoryFinder;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FacesUtil {

    // Getters
    // -----------------------------------------------------------------------------------

    public static FacesContext getFacesContext(HttpServletRequest request,
	    HttpServletResponse response) {
	// Get current FacesContext.
	FacesContext facesContext = FacesContext.getCurrentInstance();

	// Check current FacesContext.
	if (facesContext == null) {

	    // Create new Lifecycle.
	    LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
		    .getFactory(FactoryFinder.LIFECYCLE_FACTORY);
	    Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);

	    // Create new FacesContext.
	    FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder
		    .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
	    facesContext = contextFactory.getFacesContext(request.getSession().getServletContext(),
		    request, response, lifecycle);

	    // Create new View.
	    UIViewRoot view = facesContext.getApplication().getViewHandler()
		    .createView(facesContext, "");
	    facesContext.setViewRoot(view);

	    // Set current FacesContext.
	    FacesContextWrapper.setCurrentInstance(facesContext);
	}

	return facesContext;
    }

    // Helpers
    // -----------------------------------------------------------------------------------

    // Wrap the protected FacesContext.setCurrentInstance() in a inner class.
    private static abstract class FacesContextWrapper extends FacesContext {
	protected static void setCurrentInstance(FacesContext facesContext) {
	    FacesContext.setCurrentInstance(facesContext);
	}
    }

}

Aber die Message wurde auch dann nicht angezeigt, es kam Warning wie folgt, aber keine GrowlMessage:

Code:
Feb 27, 2015 11:07:50 AM com.sun.faces.context.ExternalContextImpl getMimeType
WARNING: JSF1091: Für Datei .jsp konnte kein Mime-Typ gefunden werden.  Fügen Sie eine Mime-Typ-Zuordnung zur web.xml der Anwendung hinzu, um dies aufzulösen.
 
Zuletzt bearbeitet von einem Moderator:

stg

Top Contributor
Naja, wie gesagt, in einem PhaseListener kannst du eine gleichwertige Prüdung vornehmen, und dann hast du die Probleme gar nicht erst..

Deine Warning deutet übrigens auf ein falsches bzw problematisches mapping hin. Ich würde das Faces Servlet immer auf *.xhtml mappen
 
Zuletzt bearbeitet:

stg

Top Contributor
beforePhase wird vor der Phase ausgeführt, afterPhase nach der Phase... logisch, oder? :)

Die Phase ist die jeweilige Phase des JSF Lifecycles auf der der Listener horcht.
 

OnDemand

Top Contributor
Ja ist logisch stimmt^^ Aber wir kann ich da ganze Verzeichnisse mit einem PhaseListener sperren bzw auf Login prüfen und entsprechend um-/weiterleiten?
 

stg

Top Contributor
Eine simple Variante wäre zB die viewId auszulesen.

Java:
            final String viewId = facescontext.getViewRoot().getViewId();
            final boolean securedArea = viewId.lastIndexOf("secured") > -1;

Wenn die viewId, also quasi die aufgerufene URL nun irgendwo der String secured enthält, dann wird securedArea zu true ausgewertet.

Anschließend kannst du zB. prüfen ob eine geschützte Seite aufgerufen ist und der user eingeloggt ist, und ggefls leitest du den responst auf die login Seite weiter, so wie du es jetzt im Grunde auch schon machst:

Java:
if(securedArea && !loggedIn) {
    facescontext.getApplication().getNavigationHandler().handleNavigation(facescontext, null, "login");
    facescontext.renderResponse();
}
 
Zuletzt bearbeitet:

OnDemand

Top Contributor
Oh cool danke! Aber mein aktueller Filter stellt sich ja vor jeden Aufruf der unter.../private/* geht und leitet ggf. um.

Kann das ein PhaseListener auch?
 

OnDemand

Top Contributor
das dacht ich mir :D Aber muss ich den Listener nicht registrieren? Den Fiter hab ich in der web.xml registriert, damit er alles unter privat/* "sperrt"

HTML:
<filter>
		<display-name>LoginFilter</display-name>
		<filter-name>LoginFilter</filter-name>
		<filter-class>com.domain.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>LoginFilter</filter-name>
		<url-pattern>/private/*</url-pattern>
</filter-mapping>
 
Zuletzt bearbeitet:

stg

Top Contributor
das dacht ich mir :D Aber muss ich den Listener nicht registrieren? Den Fiter hab ich in der web.xml registriert, damit er alles unter privat/* "sperrt"

HTML:
<filter>
		<display-name>LoginFilter</display-name>
		<filter-name>LoginFilter</filter-name>
		<filter-class>com.domain.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>LoginFilter</filter-name>
		<url-pattern>/private/*</url-pattern>
</filter-mapping>

Ja, etwas ähnliches muss man für PhaseListener auch machen. Aber mit ein wenig Eigeninitiative hättest du das auch in 1 Minute selbst herausgefunden. Vermutlich sogar schneller, als es gedauert hat diesen Beitrag zu schreiben....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JSF: Zugriff auf message bundle Allgemeines EE 1
S <fmt:message> außerhalb von JSP Allgemeines EE 7
B JSF - Mehrere Message-Bundles verwenden Allgemeines EE 17
vogella Message Bundle Allgemeines EE 3
S mehrere Message Resources in Struts ansprechen Allgemeines EE 7
T GUI-Nachrichten mit Message Driven Beans? Allgemeines EE 6
B NullPointer ohne message body? Allgemeines EE 3
C Message Driven Bean soll keine Nachrichten empfangen Allgemeines EE 4
G Message Provider im JBoss wechseln Allgemeines EE 3
G message-resources Allgemeines EE 6
S Struts: Problem mit <bean:message> - Tag Allgemeines EE 1
B eine vom Admin hochgeladene csv -Datei in der Datatable auch von jedem User sichtbar Allgemeines EE 0
C Fotoverwaltung in einer Multi-User Anwendung Allgemeines EE 4
T JSF User erstellen Allgemeines EE 22
P Nur ein User für Web Application Allgemeines EE 11
G Multi User Problem Allgemeines EE 8
B Tomcat -> Funktions User Credentials hinterlegen Allgemeines EE 7
TRunKX hx:commandExButton DAtei erstellen und dem User zum Download Allgemeines EE 7
A Mehrere User gleichzeigig, wie mach ich das? Allgemeines EE 14
F FORM Auth in JBoss für User mit falscher Rolle ? Allgemeines EE 2
B Session Daten pro User merken Allgemeines EE 9
I EMail Bestätigung bei neuem User Allgemeines EE 3
B Woher kommt der User? Verweise . Links . Allgemeines EE 2

Ähnliche Java Themen

Neue Themen


Oben