# System-Event in der faces-config.xml klappt nicht



## Mr.y (9. Okt 2012)

Hallo, ich habe nach einer Möglichkeit gesucht, dass schon beim Laden der Seite
irgendwas in einer Java-Funktion gemacht werden soll.
Da bin ich auf das Systemevent: PostConstructApplicationEvent gestoßen

Den hab ich dann implementiert:


```
public class JSFEvent implements SystemEventListener{

    @Override
    public void processEvent(SystemEvent event) throws AbortProcessingException {
        
        if (event instanceof PostConstructApplicationEvent) {
            System.out.println("Startevent wurde gefeuert");
           
       }
        
    }

    @Override
    public boolean isListenerForSource(Object source) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}
```

Und das passen in der faces-config.xml notiert:


[XML]<faces-config version="2.1"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">

     <application>

         <navigation-rule>
             <from-view-id>hauptSeite.xhtml</from-view-id>
         </navigation-rule>

    	<system-event-listener>
		<system-event-listener-class>

                       Event.JSFEvent

		</system-event-listener-class>
		<system-event-class>
                    javax.faces.event.PostConstructApplicationEvent
		</system-event-class>    					
    	</system-event-listener> 

    </application>
</faces-config>[/XML]

Nur dann kommt eine irrsinnige Fehlermeldung, dass die Konfiguration fehl schlug.
Die Klasse "JSFEvent" befindet sich nur in der Package: Event.
Es gibt keine Oberpakete mehr...

Was habe ich falsch gemacht?`
Danke für jeden Tipp?


----------



## Fant (9. Okt 2012)

Einen Fehler seh ich jetzt nicht direkt, aber zwei Sachen fallen auf:
- package-Namen sollten klein geschrieben werden
- die halbe Navigationsregel..

Vielleicht reicht das dann ja schon aus, wenn du das anpasst? Ansonsten poste doch mal die komplette Fehlermeldung, sowie Infos über Server, JSF-Implementierung usw... vielleicht weiß dann jemand mehr.


----------



## Mr.y (9. Okt 2012)

OK 

habe das package umgenannt und die navigationsregel rausgenommen, dennoch bleibt folgende meldung beim deployen:



> Fehler beim Deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Not supported yet.






> PER01003: Deployment encountered SQL Exceptions:
> PER01000: Got SQLException executing statement "CREATE TABLE PROJEKT (ID BIGINT NOT NULL, ProjektPosition INTEGER UNIQUE, Projektbezeichnung VARCHAR(255) UNIQUE, PRIMARY KEY (ID))": java.sql.SQLException: Table/View 'PROJEKT' ist bereits in Schema 'MR' vorhanden.
> PER01000: Got SQLException executing statement "CREATE TABLE PROJEKTEINTRAG (ID BIGINT NOT NULL, MSTRDESCRIPTION VARCHAR(255), MSTRPRIORITY VARCHAR(255), PASSENDESPROJEKT_ID BIGINT, PRIMARY KEY (ID))": java.sql.SQLException: Table/View 'PROJEKTEINTRAG' ist bereits in Schema 'MR' vorhanden.
> PER01000: Got SQLException executing statement "ALTER TABLE PROJEKTEINTRAG ADD CONSTRAINT PRJKTNPSSNDSPRJKTD FOREIGN KEY (PASSENDESPROJEKT_ID) REFERENCES PROJEKT (ID)": java.sql.SQLException: Constraint 'PRJKTNPSSNDSPRJKTD' ist bereits in Schema 'MR' vorhanden.
> ...






> weil sie in einer für 'SEQUENCE' definierten Vorgabe für einen eindeutigen oder Primärschlüssel bzw. für einen von 'SQL121007231515960' bezeichneten eindeutigen Index zu einem duplizierten Schlüsselwert geführt hätte.???



In der Db gibts tatsächlich ne Tabelle SEQUENCE, die ich aber selbst nicht erstellt habe, woher kommt sie?
Und dort gibts nur einen Datensatz:


SEQ_NAME | SEQ_COUNT
-----------------------------
SEQ_GEN   |      150

Was ist das für ne Tabelle und welchen Zweck erfüllt sie??


----------



## Fant (9. Okt 2012)

Du versuchst offenbar bei jedem Deployment aus den Entity-Klassen das Datenbankschema zu erzeugen. Das solltest du aber nur einmal machen! In der persistence.xml solltest du die _Table generation strategy_ auf _none_ umstellen, nachdem du das Datenbankschema einmalig erstellt hast, oder auf _drop and create_, jedoch werden bei dieser Variante bestehende Tabellen samt Inhalt gelöscht (also vorsichtig damit umgehen).

Die Tabelle SEQUENCE wird von deinem JPA Provider automatisch angelegt und dient dazu automatisch eindeutige IDs vergeben zu können. Wenn du dazu mehr wissen willst, dann einfach mal nach @GeneratedValue und den verschiedenen GenerationTypes, die dabei zur Verfügung stehen, suchen.


----------



## Mr.y (9. Okt 2012)

danke dir für die Erklärung, nun hab ich das auf "None" gestellt und die Fehlermeldung hat sich erheblich verkürzt und und verändert:



> Fehler beim Deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Not supported yet..



Was wäre den, wenn ich diese SEQUENCE- Tabelle leeren würde? würde das was bringen..???


----------



## Fant (9. Okt 2012)

Dann liefer mal eine Implementierung für die #isListinerForSource-Methode nach. Wenn die aufgerufen wirft, dann schmeißt du ja jedes mal ne Exception.
Zu Testzwecken kannst du ja einfach mal


```
@Override
    public boolean isListenerForSource(Object source) {
      return true
    }
```

schreiben. Eine sinnvolle Implementierung kannst du dann ja immer noch nachliefern.


----------



## Fant (9. Okt 2012)

Mr.y hat gesagt.:


> Was wäre den, wenn ich diese SEQUENCE- Tabelle leeren würde? würde das was bringen..???



Ne, das würde eher wieder zu nem Fehler führen, da dein JPA-Provider dann nach dem nicht mehr vorhandenen Eintrag suchen würde, aber nichts finden kann. 
Der Wert in der Spalte SEQ_COUNT wird jeweils als ID für ein neues Objekt gewählt und dann automatisch erhöht. SEQ_GEN ist ein default-Name für den Standard-ID-Generator, den dein JPA-Provider benutzt, wenn nichts anderes angegeben wurde.


----------



## Mr.y (9. Okt 2012)

und worauf könnte diese fehlermeldung deuten?


----------



## Fant (9. Okt 2012)

Worauf soll da irgendwas hindeuten? DU schmeißt doch in deinem Code diese Exception. Deswegen einfach mal 
	
	
	
	





```
true
```
 returnen statt ne RuntimeException zu werfen.


----------



## Mr.y (9. Okt 2012)

ahh diese neue Methode hab ich gar net gemerkt 
danke dir, jetzt läufts^^


----------



## Fant (10. Okt 2012)

Denk aber daran noch eine gescheite Implementierung dieser Methode nachzuliefern:



> This method must return true if and only if this listener instance is interested in receiving events from the instance referenced by the source parameter.



[JAPI]http://docs.oracle.com/javaee/6/api/javax/faces/event/SystemEventListener.html[/JAPI]


----------



## sence (10. Okt 2012)

Alternativ:
web.xml

```
<servlet>
<servlet-name>My Init Class</servlet-name>
<servlet-class>way.to.my.package.ClassName</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
```

Dann:
Die Klasse ClassName erstellen und von Servlet ableiten.


----------



## Fant (10. Okt 2012)

sence hat gesagt.:


> Alternativ:
> web.xml
> 
> ```
> ...



inwiefern hat das was mit dem SystemEventListener zu tun? Oder wozu soll das ne Alternative sein ???:L


----------



## sence (10. Okt 2012)

Fant hat gesagt.:


> inwiefern hat das was mit dem SystemEventListener zu tun? Oder wozu soll das ne Alternative sein ???:L





> Mr. Y:
> Hallo, ich habe nach einer Möglichkeit gesucht, dass schon beim Laden der Seite
> irgendwas in einer Java-Funktion gemacht werden soll.




Nachdem laden kann dann im Konstruktor der Klasse z.B. eine Funktion aufgerufen werden,
Ein TimerTask gestartet werden oder sonstige Sachen durchgeführt werden.
Es ist somit eine Alternative Möglichkeit, beim Start der Webapplikation etwas auszuführen.


----------



## Sym (11. Okt 2012)

Ich glaube, hier ging es aber um das Laden einer bestimmten Seite und nicht das Starten der Applikation.


----------



## sence (11. Okt 2012)

dann wäre die Alternative das PreRenderViewEvent 

#myPage.xhtml
<f:event listener="#{bean.myFunction()}" type="preRenderView" />

#Class Bean
public void myFunction(ComponentSystemEvent event){

}


----------

