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

Mr.y

Aktives Mitglied
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:

Java:
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

Bekanntes Mitglied
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

Aktives Mitglied
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.
PER01000: Got SQLException executing statement "CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(15), PRIMARY KEY (SEQ_NAME))": java.sql.SQLException: Table/View 'SEQUENCE' ist bereits in Schema 'MR' vorhanden.
PER01000: Got SQLException executing statement "INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)": java.sql.SQLIntegrityConstraintViolationException: Die Anweisung wurde abgebrochen, 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.


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

Bekanntes Mitglied
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

Aktives Mitglied
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

Bekanntes Mitglied
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

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

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

Fant

Bekanntes Mitglied
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.
 

Fant

Bekanntes Mitglied
Worauf soll da irgendwas hindeuten? DU schmeißt doch in deinem Code diese Exception. Deswegen einfach mal
Code:
true
returnen statt ne RuntimeException zu werfen.
 

Fant

Bekanntes Mitglied
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

Bekanntes Mitglied
Alternativ:
web.xml
Java:
<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

Bekanntes Mitglied
Alternativ:
web.xml
Java:
<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.

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

sence

Bekanntes Mitglied
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.
 
S

Sym

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

sence

Bekanntes Mitglied
dann wäre die Alternative das PreRenderViewEvent :)

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

#Class Bean
public void myFunction(ComponentSystemEvent event){

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F.S.WhiTeY JSF JSF und JFreeChart, XML -> System.setProperty Web Tier 2
N is out of sync with file system Web Tier 2
F Plugin System Web Tier 2
C servlet abbruch mit System.exit() Web Tier 8
J Wie Mouse Event in Servlet einbinden? Web Tier 1
H Blinkender Cursor verursacht onkeyup-Event Web Tier 5
A h:graphicsImage Event hinzufuegen Web Tier 5
I JSF JSF, Tomcat, Server Faces und maven Web Tier 3
feinperligekohlensaeure JSF JSF + Tomcat 9 | HTTP Status 404 |(com.sun.faces.config.ConfigureListener?) Web Tier 1
R com.sun.faces.context.SessionMap.put(key, value) Web Tier 2
A Faces Context nicht mehr erreichbar nach Servlet Aufruf Web Tier 1
J Navigationsregeln in faces-config Web Tier 3
J JSF String cannot be cast to javax.faces.model.SelectItem Web Tier 12
F JSF (JavaServer Faces) - Spaltengestaltung: selectOneRadio Feat. selectItem Web Tier 6
F ADF Faces & Apache Trinidad Web Tier 5
J Faces response aus einem anderen Servlet heraus rendern Web Tier 4
G JSF javax.faces.bean Web Tier 2
I Rich Faces nur mit JBoss oder auch Tomcat? Web Tier 7
G "JavaServer Faces: The Complete Reference" empfehl Web Tier 2
G Undefined component type javax.faces.ViewRoot Web Tier 3
G WARNUNG: JSF1059: WARNING! The com.sun.faces.verifyObjects Web Tier 2
G Validierung mit Java Server Faces Web Tier 4

Ähnliche Java Themen

Neue Themen


Oben