28. Juni 2007

Struts & ApplicationResources FAQ

In welchem Format müssen die Properties-Files vorliegen

Die Dateien müssen wie im ISO-8859-1 Format gespeichert werden (NICHT IN UTF-8!!!). Zeichen die über diesen Zeichensatz hinausgehen müssen in Unicode Escapes gespeichert werden.



Wie findet Struts die Default-Sprache bei
ApplicationResource Sprache?

Der Default für Struts bei ApplicationResources (also das File, das genommen wird, wenn die Browsersprache nicht gefunden) ist nicht das Property-File ohne Sprachendung, sondern das Property-File mit der Endung der Locale, die als System-Property der JVM gesetzt ist.

Diesen Werte kann man setzen über
  1. System-Property -Duser.language=de -Duser.region=DE
  2. über API: Locale.setDefault()

Ein Beispiel dazu:

Die System-Locale ist auf de_DE gesetzt.

Es existieren folgende Property-Files:

myfile.properties (enthält englische Texte)
myfile.properties_de (enthält deutsche Texte)
myfile.properties_it (enthält italienischeTexte)

Ein Benutzer kommt mit der Browser-Sprache russisch in die Applikation. Er bekommt nicht die
englischen Texte aus myfile.propertiesm sondern die deutschen Texte aus myfile.properties_de!


html locale

Um JSPs mit den bean:message - Tags lokalisiert darzustellen, muss der Tag

<html:html locale="true"/>

nur gesetzt werden, wenn der Aufruf der JSP direkt erfolgt (http://myserver/person.jsp) und nicht über die Action (http://myserver/person.do). Über die Action sorgt Struts selbst dafür.


Achtung: Ist seit Struts 1.29 deprecated

Stattdessen muss

<html:html lang="true"/>

verwendet werden.

25. Juni 2007

Hibernate - Filter für 1:n-Beziehungen definieren

Definition des Filters in einem Mapping-File:

<hibernate-mapping>
...
<filter-def name="theFilter">
<filter-param name="theParam" type="int"/>
</filter-def>
...
</hibernate-mapping>

In einer 1:n-Beziehung (hier am Beispiel einer indizierten Liste) wird der Filter angegeben. Die Condition landet in der WHERE-Klausel:

<list name="myListOfSomething" inverse="true" lazy="false" >
<key>
<column name="PF_ID" precision="11" scale="0" not-null="true" />
</key>
<index column="MYPK" />
<one-to-many class="Something" >
<filter name="theFilter" condition="MYPK=:theParam"/>
</list>


Beim Aufruf wird der Filter wie folgt definiert

Filter filter = session.enableFilter("theFilter");
filter.setParameter("theParam",new Integer(2));

20. Juni 2007

ANT Task "JAVAC" aus JDeveloper starten - Problem mit unterschiedlichen JDKs

Problem: JDeveloper wird z.B. mit JDK 1.5 gestartet. Über ein ANT-Buildfile hat man eine JAVAC-Task zum Kompilieren der Sourcen mit dem 1.4er Compiler definiert. Bei der Ausführung kommt es zu Laufzeitfehlern bedingt durch API-Unterschiede, z.B.

java.lang.NoSuchMethodError: java.math.BigDecimal.(I)V


Ursache: Obwohl Ant im JDev so konfiguriert ist, dass es unter 1.4 läuft, wird dennoch die rt.jar von 1.5 geladen.

Lösung: Verwendung des bootclasspath-Attributs unter Angabe des Pfads zur rt.jar

<target name="compile" description="Compile Java source files">
<javac destdir="${output.dir}" classpathref="classpath"
debug="${javac.debug}" nowarn="${javac.nowarn}"
bootclasspath="${jdk.path}lib/rt.jar"
deprecation="${javac.deprecation}" encoding="Cp1252" source="1.4">
<src path="src"/>
</javac>
</target>

Problem bei der Migration von JDEV 10.1.2 Projekten nach höheren Versionen

Problem: Beim Build-Prozess des JDeveloper treten Fehler auf (z.B. dass xml-Dateien nicht mehr in das Build-Verzeichnis kopiert werden). In der Konsolenausgabe der jdev.exe erscheint

java.lang.ClassCastException: oracle.bali.xml.addin.XMLSourceNode

Ursache: Es ist ein fehlerhafter Eintrag im Projektfile (.jpr):

<hash n="ejbModuleContainer">
<value n="ejbVersion" v="NOT SPECIFIED"/>
<url n="orionEjbJarNodeURL" path="src/META-INF/orion-ejb-jar.xml"/>
</hash>


Lösung: Der Eintrag muss entfernt werden.

18. Juni 2007

Java & XML Konfiguration

JAXP

XML-Verarbeitung ist standardisiert durch die Java API for XML Processing (JAXP)
Bis 1.4 war es nicht Bestandteil des JDK und muss separat heruntergeladen werden.

JDK 1.5 beinhaltet JAXP 1.3
JDK 1.6 beinhaltete JAXP 1.4

Interfaces/Abstrakte Klassen, etc
  • xml-apis.jar oder jaxp-api.jar oder xmlPasrserAPIs.jar
  • Optional, wenn nicht in den ersten enthalten:
    • sax.jar: Simple API for XML Processing
    • dom.jar Document Object Model API
JAXP-Implementierungen

Vor JDK 1.6 muss separat eine JAXP-Implementierung bezogen werden. Bei JDK 1.6 kommt eine RI im rt.jar mit (ist Xerces/Xalan)
  • xercexImpl.jar -> Xerces
  • Oracle XML Parser V2 for Java
  • Crimson
  • Saxon
  • xalan.jar -> Xalan (Transformation)

Properties
  • javax.xml.parsers.SAXParserFactory (für SAX-Parser)
  • javax.xml.parsers.DocumentBuilderFactory (für DOM-Parser)
  • javax.xml.transform.TransformerFactory (für XSLT)

Werte, z.B.:
  • org.apache.xerces.jaxp.SAXParserFactoryImpl
  • org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
  • com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

Diese Properties werden in dieser Reihenfolge ausgelesen:
  • System-Properties mit der Option -D gesetzt (beim Aufruf der java.exe) oder im Java-Code mit System.setProperty()
  • über jaxp.properties (in [PFAD zum JDK]\jre\lib)
  • In einem jar File im Ordner META-INF/services (So wird z.B. bei Tomcat-Distribution im common\endorsed-Ordner der XML-Parser gesetzt).
  • Als Fallback-Lösung, wird die Systemimplementierung verwendet

15. Juni 2007

Deployment von WAR-Files unter Tomcat 6

Problem: Reploy oder Undeploy von per WAR-Files deployten Applikationen unter Tomcat funktioniert nicht:

Ursache: Es werden manche jar gesperrt, so dass sie nicht mehr gelöscht werden können.

Lösung: In das WAR-File muss im META-INF Ordner die Datei context.xml sein.

Diese muss den Eintrag antiResourceLocking="true" haben.

Beispiel:


<Context path="/guardian" crossContext="true" debug="0" reloadable="true"
antiResourceLocking="true"
>
>
</Context>

5. Juni 2007

2. Juni 2007

.NET Security Policies in einer Unternehmensumgebung

Problem: Laufzeitsicherheitsrichtlinen (Runtime Security Policy) in einer Unternehmensumgebung (Active Directory) verteilen.

Lösung: In der .NET Configuration MMC über rechte Maustaste "Create Deployment Package" ein MSI-Paket erstellen, dass dann auf jedem benötigten Rechner verteilt wird.