osRetail – Primefaces 4 Upgrade

Wir sind wieder einen Schritt weiter. osRetail in der finalen Primefaces 4.0 Version. Und als Maven Projekt. osRetail das erste open Source ERP System für den Handel. Wir versuchen das starre Korsett eines fertigen ERP System aufzubrechen. Dem Kunden eine möglichst große Vielfalt an Standardfunktionalität zu bieten und auch kostspielige Funktionen wie der Katalogerstellung frei Haus mitzuliefern.

Vor ca. einem Jahr haben wir uns dazu entschlossen ein großes Refactoring der Software durchzuführen. So haben wir nicht nur die Entwicklungsumgebung von Netbeans auf Eclipse geändert. Wir haben auch IceFaces ausgetauscht und – mit dem leistungsstarken Framework – Primefaces einen weiteren Schritt zu einer moderneren Arbeitoberfläche geebnet.

jee7-standard

Ebenso wurde der Code überarbeitet. Derzeit verwenden wir den JEE7 Standard um den aktuellsten Stand der Enterprise Entwicklung von Java nutzen zu können. Autodeployments über Jenkins erleichtern uns die Arbeit erheblich da wir alle Code Commits und Änderungen auf den Testsystem schnellst möglich dem publishen können.

maven-overview-plugin

Maven unterstützt uns bei der Library Auswahl. Mit einfachsten Mitteln ist es möglich neue oder ältere Bibliotheken auszuwählen und automatisch in der Entwicklung und beim Deployment zu verwenden.

Glassfish 4 bietet uns einen schnellen Application- Server der leicht zu handeln ist. Skalierbarkeit, effizientes Arbeiten und schnelle Deployments standen dabei im Vordergrund. Durch einfache Erweiterbarkeit ist es uns möglich schnell auf Kundenwünsche zu reagieren.

Primefaces – web.xml korrekt Konfigurieren

Für Glassfish sind ein paar mehr Einstellungen notwendig um Primefaces Push zu aktivieren und auch korrekt laufen zu lassen.

Im Webprojekt muss die web.xml folgendermaßen erweitert werden:

 

   <servlet>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <init-param>
      <param-name>org.atmosphere.cpr.sessionSupport</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
      <param-value>org.atmosphere.cache.SessionBroadcasterCache</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcastFilterClasses</param-name>
      <param-value>org.atmosphere.client.TrackMessageSizeFilter</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.WebSocketProcessor</param-name>
      <param-value>org.atmosphere.cpr.HttpServletRequestWebSocketProcessor</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.disableOnStateEvent</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useNative</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useWebSocket</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.websocket.maxTextMessageSize</param-name>
      <param-value>0</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>

 

PrimeFaces GZip Error

Ein häufig auftretender und nicht erklärbarer Fehler in Primefaces ist der GZIP Error. Es gibt unterschiedliche Möglichkeiten bei Aktionen die definiert werden und eventuell falsch ausgeführt werden.

Wir suchen seit nunmehr – sporatisch – 1 Monat nach den Fehler und immer ist es lediglich ein kleines Quäntchen Glück das uns gefehlt hat. Es dreht sich um den wunderbaren Parameter ajax den man in den meisten Komponenten von Primefaces angeben kann und dieser dann entscheidet ob ein ajax Befehl ausgeführt wird oder nicht.

Jetzt kommt das große Ding und zugleich die Erklärung. Wenn man über outcomes gesteuerte Navigation- Elements anlegt in seiner faces-config.xml werden anhand eines String die Elmente gerootet. z.B.

<p:commandButton value="Step1" action="to-step-1" />

In der faces-config.xml werde ihr so etwas ähnliches vorfinden:

<navigation-rule>
		<display-name>Step 0</display-name>
		<from-view-id>/step0.xhtml</from-view-id>
		<navigation-case>
		 	<from-outcome>to-step-1</from-outcome>
			<to-view-id>/step1.xhtml</to-view-id>
		</navigation-case>
</navigation-rule>

Wenn ihr dieses Beispiel jetzt ausführen würdet, lauft ihr in eine Falle die nicht schön ist und aus der mann nur ganz schwer wieder heraus kommt weil es keine konkreten Hinweise dazu gibt. Wenn man in die Browserconsole oder die Entwicklertools von z.B. google Chrome schaut werdet ihr sehen das nach dem laden von step1.xhtml euer jQuery abstürzt und somit die Seite jegliche Funktionalität verliert die euch Primefaces bietet.

Einfacher Lösungsansatz:

<p:commandButton value="Step1" action="to-step-1" ajax="false" />

Der kleine Parameter ajax=“false“ verwandelt den Javascript Aufruf für den Button in einen Standardaufruf um und „refreshed“ die Seite somit korrekt und alle Funktionen werden korrekt ausgeführt!