Archiv für Kategorie Application Server
JPA/EclipseLink 2 & Spring 3.0.2: The container policy [IndirectListContainerPolicy(class org.eclipse.persistence.indirection.IndirectList)] is not compatible with transparent indirection
Verfasst von Schakko unter Application Server, Eclipse, Java am 2. Juni 2010
Nachdem ich mir die letzten beiden Tage ein paar Sachen zu JPA und JTA durchgelesen hatte, setzte ich eine kleine Test-Anwendung auf, die mir mit Hilfe von Spring 3.0.2 und JPA/EclipseLink 2 Benutzer und deren Gruppen aus einer Datenbank laden sollte.
Das Datenbankschema dazu war einfach: Tabelle user, Tabelle group - zwischen beiden besteht eine n:m-Beziehung (Zwischentabelle user_in_group)
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="WebDefault" transaction-type="RESOURCE_LOCAL"> <class>de.ecw.project.sql.vo.UserVO</class> <class>de.ecw.project.sql.vo.GroupVO</class> <properties> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> <property name="eclipselink.ddl-generation.output-mode" value="both"/> </properties> </persistence-unit> </persistence>
GroupVO.java
package de.ecw.project.sql.vo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import de.ecw.project.sql.Schema;
@Entity
@Table(name = Schema.GROUP_TABLE)
public class GroupVO
{
@Id
@GeneratedValue
@Column(name = Schema.COLUMN_ID)
private long id;
@Column(name = Schema.COLUMN_NAME)
private String name;
public void setId(long id)
{
this.id = id;
}
public long getId()
{
return id;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
UserVO.java
package de.ecw.project.sql.vo;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import org.springmodules.validation.bean.conf.loader.annotation.handler.Length;
import org.springmodules.validation.bean.conf.loader.annotation.handler.NotBlank;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import de.ecw.project.sql.Schema;
@XStreamAlias("user")
@Entity
@Table(name = Schema.USER_TABLE)
public class UserVO
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = Schema.COLUMN_ID)
private long id;
@NotBlank
@Length(max = 255, min = 10)
@Column(name = Schema.USER_COLUMN_USERNAME)
private String username;
@NotBlank
@Length(max = 255, min = 5)
@Column(name = Schema.COLUMN_NAME)
private String name;
@Column(name = Schema.USER_COLUMN_PASSWORD)
private String password;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = Schema.USER_IN_GROUP_TABLE, joinColumns = @JoinColumn(name = Schema.COLUMN_USER_ID), inverseJoinColumns = @JoinColumn(name = Schema.COLUMN_GROUP_ID))
@OrderBy(Schema.COLUMN_ID + " DESC")
private Collection<GroupVO> groups;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setUsername(String username)
{
this.username = username;
}
public String getUsername()
{
return username;
}
public void setId(long id)
{
this.id = id;
}
public long getId()
{
return id;
}
public String toString()
{
return "user";
}
public void setPassword(String password)
{
this.password = password;
}
public String getPassword()
{
return password;
}
public void setGroups(Collection<GroupVO> groups)
{
this.groups = groups;
}
public Collection<GroupVO> getGroups()
{
return groups;
}
}
dispatcher-servlet.xml
... <context:component-scan base-package="de.ecw" /> <bean id="dataSource" name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="generateDdl" value="true" /> <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" /> </bean> </property> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" /> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="userDAO" name="userDAO" class="de.ecw.project.sql.dao.impl.UserDAOImpl"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> ...
Wenn ich die Anwendung im Tomcat startete, wurden keine Fehler ausgeworfen – sobald aber das erste Mal auf die DAO-Schicht bzw. VOs zugegriffen wurde, schmiss mir EclipseLink folgenden Fehler:
Local Exception Stack: Exception [EclipseLink-148] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.DescriptorException Exception Description: The container policy [IndirectListContainerPolicy(class org.eclipse.persistence.indirection.IndirectList)] is not compatible with transparent indirection. Mapping: org.eclipse.persistence.mappings.ManyToManyMapping[groups] Descriptor: RelationalDescriptor(User --> [DatabaseTable(user)])
Bei Google ließ sich bis auf zwei Einträge dazu nichts finden; die in den Threads beschriebenen Lösungsvorschläge brachten auch nichts.
Wenn ich mir die Dokumentation von Spring komplett durchgelesen hätte , wäre ich auch schneller auf die Lösung gekommen:
- In der dispatcher-servlet.xml muss SimpleLoadTimeWeaver durch InstrumentationLoadTimeWeaver ersetzt werden
- Die Eclipse-Anwendung muss mit den VM Argumenten -javaagent:
<Pfad>/WebContent/WEB-INF/lib/org.springframework.instrument-3.0.2.RELEASE.jar gestartet werden. - Zusätzlich habe ich noch in der server.xml im Kontext der Anwendung (<Context…) den TomcatInstrumentableClassLoader eingebunden (<<Loader loaderClass=”org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader” useSystemClassLoaderAsParent=”false”/>)
Nach einem Neustart des Tomcats lief dann die Anwendung auch und die zugehörgen Datenbanktabellen wurden automatisch erzeugt.
CruiseControl / SVNBootstrapper: Server certificate verification failed: issuer not trusted
Verfasst von Schakko unter Application Server, Effizient arbeiten am 28. September 2009
Heute habe ich endlich die Zeit gefunden, mich um unseren Buildserver zu kümmern.
Meine erste Aufgabe bestand darin, dass ich die kompletten Konfigurationsdateien so abstrahiert habe, dass die eine Projekt-Konfiguration letztendlich nur noch aus 10 Zeilen XML-Code besteht, in denen u.a. der Pfad zum SVN-Repository angegeben ist.
Dies funktionierte auch alles wunderbar, bis der SVNBootstrapper zum ersten Mal die Verbindung mit dem Repository aufnahm.
Im Log bekam ich folgenden Fehler zu sehen:
2009-09-28 14:15:20,739 [Thread-28] WARN SVNBootstrapper – svn: OPTIONS von ¯https://$host/svn/$project/trunk®: Server certificate verification failed: issuer is not trusted (https://$host)
2009-09-28 14:15:21,051 [Thread-27] INFO Project – Project $projectidle
2009-09-28 14:15:21,051 [Thread-27] INFO ProjectController – $project Controller: build progress event: idle
2009-09-28 14:15:21,051 [Thread-27] ERROR Project – exception attempting build in project $project
net.sourceforge.cruisecontrol.CruiseControlException: svn process exited with error code 1
Nach kurzer Recherche wurde ich fündig: Das Benutzerkonto, unter dem CruiseControl läuft, muss das Client-Zertifikat installieren. Dazu gibt es entweder die Möglichkeit, im Subversion-Konfigurationsverzeichnis die SSL-Settings anzupassen oder aber – einfacher – das Zertifikat im Zertifikate-Speicher zu installieren.
Wichtig ist dabei, dass CruiseControl unter einem lokalen Benutzer-Account als Dienst läuft und nicht als NetworkService oder Local System.
Unter dem Benutzer-Account unter dem CC läuft, muss man sich nun anmelden, Internet Explorer starten, auf die URL des WebDAV-Ordners gehen, das Zertifikat installieren und schließlich den CC-Dienst neu starten. Nun funktioniert alles wunderbar und das Projekt Build-Server geht langsam aber sicher dem Ende entgegen
Bug unter Linux mit Java 1.5.0
Verfasst von Schakko unter Application Server, Java, Linux am 10. Februar 2009
Gestern war ich damit beschäftigt, unser Deployment-Tool im Server-Modus in einer Ubuntu-VM zu installieren. DT läuft als J2EE-Applikation und wurde von mir in einem Tomcat 6.0 unter Java 1.6 deployt. Die Kombination von Tomcat 6.0 und Java 1.6 führte aber -mal wieder aus unerfindlichen Gründen – dazu, dass weder die Logs unter /var/log/tomcat6 gefüllt wurden, noch mein eigenes DT-Log. Die Dateien wurden zwar angelegt, aber die Log-Messages wurden nicht geschrieben. Laut ps aux und /var/log/syslog lief Tomcat aber. Der Verdacht, dass die Festplatte vollgelaufen wäre, bestätigte sich nicht.
Ich führte also ein Downgrade auf Java 5 und Tomcat 5.5 durch. Nach dem Start des Tomcats bekam ich ein Segmentation Fault der Hotspot VM mit dem Status SIGBUS (0×7). Im Internet wurde ich dann im Bugtracker von Sun auch schnell fündig: Sobald das /tmp-Verzeichnis voll ist, schmiert die Hotspot VM ab. Der Fehler traf auf mein Problem genau zu, da ich vorher mit strace die Aufrufe der VM nachgegangen bin und diese nach dem Zugriff auf /tmp/hsperfdata abstürzte. Radikale Lösung war: rm -rf /tmp/*.
How to solve Problems with Outlook Mobile Access
Verfasst von Schakko unter Application Server, Arbeit am 15. Juli 2008
As written in my last post, I got more than strange errors after integrating PHP into IIS 6.0.
Here a list of errors I received for Outlook Mobile Access (OMA):
Unbekannter Fehler beim Verarbeiten der aktuellen Anforderung:
Meldung: Methode nicht gefunden: System.String System.DirectoryServices.DirectoryEntry.get_Password().
Quelle: Microsoft.Exchange.OMA.Preferencing
Stacktrace:
bei Microsoft.Exchange.OMA.Preferencing.AdUserObject.get_globalWirelessEnable()
bei Microsoft.Exchange.OMA.Preferencing.AdUserObject.get_UserIsWirelesslyEnabled()
bei Microsoft.Exchange.OMA.Preferencing.OmaUserInfo.get_UserIsWirelesslyEnabled()
bei Microsoft.Exchange.OMA.UserInterface.Global.Session_Start(Object sender, EventArgs e)
Meldung: Eine Ausnahme vom Typ Microsoft.Exchange.OMA.DataProviderInterface.ProviderException wurde ausgelöst.
Ereignismeldung:
Benutzermeldung: Systemfehler bei der Verarbeitung Ihrer Anforderung. Versuchen Sie es erneut. Wenden Sie sich an Ihren Administrator, wenn das Problem wiederholt auftritt.
Quelle: Microsoft.Exchange.OMA.UserInterface
Stacktrace:
bei Microsoft.Exchange.OMA.UserInterface.Global.Session_Start(Object sender, EventArgs e)
bei System.Web.SessionState.SessionStateModule.RaiseOnStart(EventArgs e)
bei System.Web.SessionState.SessionStateModule.CompleteAcquireState()
bei System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData)
bei System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
bei System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
(source MSExchangeOMA, event ID 1503). Another error was event ID 1309, source ASP .NET 2.0x.
I can not locate the origin of this error but I solved it in the following way: First I regenerated OMA and OWA virtual directories as described in Microsofts KB.
Next I deleted the existing application pool in IIS manager and created a new one called ExchangeMobileApplicationPoo“.
I assigned “OMA” to ExchangeMobileApplicationPoo” and set the ASP.NET environment to version 1.1. OMA only works with ASP.NET 1.1. The funny thing is that our previous OMA configuration run under ASP.NET 2.0.x – whatever.
Exchange OMA & OWA defekt
Verfasst von Schakko unter Application Server, Arbeit am 15. Juli 2008
Kurz vor Arbeitsende habe ich heute Abend den letzten Stand meines svnPostCommitHooks auf unserem Server deployt. Da das Tool unter PHP läuft, musste ich im IIS noch das php5isapi-Modul aktivieren.
Durch äußerst rätselhafte Umstände funktionierte danach weder Outlook Mobile Access, noch Outlook Web Access noch sonst irgend etwas. Die Aktivierung des ISAPI-Filters muss irgendwelche Einstellungen überschrieben haben.
Nach zwei Stunden rum-gefluche bin ich nun in der KB von Microsoft auf einen pragmatischen Lösungsansatz gestoßen: Das Zurücksetzen der virtuellen Standard-Verzeichnisse. Ich werde dies gleich mal austesten.
Dies ist der Fehler, der im Eventlog auftrat:
An unknown error occurred while processing the current request:
Message: The remote server returned an error: (501) Not Implemented.
Source: Microsoft.Exchange.OMA.ExchangeDataProvider…
Event Id 1503.
Es liegt vermutlich daran, dass die Filter von OMA und OWA entfernt wurden.
Update: OWA läuft, OMA hingegen nicht. Lösung des Rätsels siehe nächster Post.
Patched mod_auth_sspi compiled against Apache 2.0.61
Verfasst von Schakko unter Active Directory / LDAP, Apache, Application Server, Publikationen am 9. Mai 2008
The last Apache module i published was linked against Apache 2.0.54 and compiled with Visual Studio 2005. Yesterdy evening I noticed, that the module does not work with Apache 2.0.61.
So i compiled it with Visual C++ 6 and used the includes from Apache 2.0.61.
PHP-Distribution unter Win32 selbst kompilieren / PHP & Tomcat
Verfasst von Schakko unter Application Server, PHP am 17. April 2008
Alexander Merz erklärt in verschiedenen Artikeln, wie man PHP im Tomcat-Container laufen lassen kann.
Unter http://kromann.info/php.php wird detailiert erklärt, wie man den kompletten PHP-Sourcecode unter Windows kompilieren kann. Außerdem existieren dort die aktuellen Builds aller aktuellen PHP-Branches. Eventuell werde ich demnächst mal die php_ssh2.dll fixen.
Wie man sich mit Hilfe von Apache Trac mit dem Active Directory verbindet
Verfasst von Schakko unter Active Directory / LDAP, Apache, Application Server, Sicherheit, Windows am 10. April 2008
Nach langer Überlegungsphase habe ich heute endlich mal den Schritt gewagt und Trac mit dem Active Directory verbunden. Alle Benutzer, die sich an Trac anmelden, werden im AD authentiziert und autorisiert.
Allerdings benutze ich dafür nicht LdapPlugin , sondern AccountManagerPlugin (AMP).
AMP ruft, nachdem Benutzername und Passwort in der Trac-Seite eingegeben worden, eine beliebig definierbare Adresse auf und überprüft, ob der Webserver einen 200er- oder 401er-Statuscode zurückgibt. Das komplette Plugin ist nicht mehr als 30 Zeilen lang.
Zuerst muss AMP installiert werden, danach müssen in der trac.ini des Projekts folgende Optionen gesetzt werden:
[components] trac.web.auth.LoginModule = disabled acct_mgr.http.HttpAuthStore = enabled acct_mgr.web_ui.LoginModule = enabled acct_mgr.web_ui.RegistrationModule = disabled acct_mgr.htfile.HtPasswdStore = disabled acct_mgr.admin.AccountManagerAdminPage = enabled acct_mgr.web_ui.AccountModule = enabled [account-manager] authentication_url = $HOST$/$SUBURL$ password_store = HttpAuthStore
$URL$ wird durch die URL ersetzt, die vom Apache überprüft werden soll.
Die httpd.conf (oder $VHOST$.conf) muss so abgeändert werden:
# Benötigte Module laden LoadModule auth_module modules/mod_auth.so LoadModule ldap_module modules/util_ldap.so LoadModule auth_ldap_module modules/mod_auth_ldap.so SetHandler mod_python PythonHandler trac.web.modpython_frontend PythonOption TracEnvParentDir c:/server/trac PythonOption TracUriRoot /trac AuthType Basic AuthName "Trac Active Directory" AuthLDAPURL "ldap://domaincontroller.domain.local:389/OU=$OU$,DC=$DOMAIN$,DC=local?sAMAccountName?sub?(objectClass=user)" AuthLDAPBindDN "$LDAP-BENUTZER$@$DOMAIN$.local" AuthLDAPBindPassword "$PASSWORT$" authldapauthoritative Off require group CN=Trac-Gruppe,DC=$DOMAIN$,DC=local
Der obige Code stammt aus einem unserer Virtual-Hosts und muss natürlich entsprechend eurer Umgebung angepasst werden.
Wichtig ist, dass $SUBURL$ auf eine bestehende Datei im DocumentRoot liegt, diese kann leer sein. Außerdem darf die Trac-Instanz nicht direkt über “/” zu erreichen sein, da sonst die $SUBURL$ durch den Python-Handler verwaltet wird.
Das obige Beispiel benutzt kein SSL. $DOMAIN$ muss durch die Domäne ersetzt werden, $LDAP-BENUTZER$ entspricht einem Benutzer, der im Active Directory existiert und $PASSWORT$ entspricht … naja dem Passwort halt.
Das Binden ist nötig, da Windows (2003) von Haus aus keine anonymen Zugriffe erlaubt.
Nun muss im Active Directory eine neue Sicherheitsgruppe mit dem Namen “Trac-Gruppe” erstellt werden, in der die erlaubten Benutzer eingetragen werden.
Das war es eigentlich auch schon.
Zur Fehleranalyse ist es sinnvoll, im Apache den LogLevel auf “debug” zu setzen und zu schauen, dass der Apache sich auch wirklich mit dem Active Directory verbinden kann, d.h. die Binding-Credentials in Ordnung sind.
Meine Woche im Überblick
Verfasst von Schakko unter Application Server, Arbeit, Java, Mobil, Rezension, Sicherheit am 23. Februar 2007
Die Woche nähert sich langsam aber sicher mit gewaltigen Schritten dem Ende. Ich habe diese Woche nicht die Zeit gefunden, großartig etwas im BibaBlog loszuwerden, deshalb folgt nun ein kleines Update.
Der Montag war bei mir relativ lame, ziemlich lange auf Arbeit gewesen. Dienstag und Mittwoch ging es dann gemeinsam mit Marci nach der Arbeit nach Bokensdorf zum Arbeiten. Bin irgendwann um 21 Uhr nach Hause gekommen und war dementsprechend fertig.
Gestern Abend hatte ich mit Robin – unserem Praktikanten – unsere Astaro-Firewall auf die V7 geupdatet. Wir mussten dafür die Festplatte ausbauen, damit wir ein lauffähiges System hätten, falls denn etwas schief gehen sollte. Und das war gut so, denn die V7 besitzt (noch) nicht die Möglichkeit, alte Einstellungen aus V6 oder früher einzuspielen. Den kompletten Regelsatz und die Einstellungen von Hand einzutragen wäre ein Ding der Unmöglichkeit gewesen und hätte für mich bedeutet, dass ich die Nacht über hätte im Büro verbringen müssen.
Die Festplatte wurde dann also wieder getauscht und ich verließ gegen halb acht, viertel vor acht das Büro.
Erstmal ging es kurz zu Macces. Ich habe seit Mittwoch nur Obst gegessen und brauchte mal wieder Fleisch. Zumindest irgendwas, dass wie Fleisch aussah.
Nach Macces machte ich mich auf zum Allegro, wo ich dann mit Dennis, Holger und Tino ein paar Runden krökelte.
Um zwanzig vor zehn zu Hause angekommen telefonierte ich mit Sarah und bügelte nebenbei meine Wäsche.
Heute Abend geht es dann mit Jessie, Jessies Freund, Holger, Jan, Ines, Marci etc pp. ins Sausalitos. Morgen und Sonntag wird gearbeitet, außerdem will ich morgen nach der Arbeit noch ins Badeland, da dort irgendwie Schwimmen für den guten Zweck ist.
Ab 1000m bekommt man wohl sogar ein Blech
Soweit erst einmal das Wochengeschehen, nun zum technischen Part:
Beim Einsatz von Trac sind folgende Plugins einen näheren Blick wert: remotesvnplugin (SVN-Repo-Browser funktioniert auch mit Nicht-lokalen Repositories), tracaccountmanager (Benutzer können ihren eigenen Account und somit ihr Passwort ändern), tracpygments (Syntax Highlighting) und natürlich tracwebadmin.
In die Rubrik Gelesen kommt das Buch “Geronimo – Schnell + kompakt” von Christian Dedek sowie Kristian Köhler. Das Buch bietet einen guten, wenn auch nicht detailierten, Überblick über Apache Geronimo. Für den schnellen Blick zwischendurch lohnt es sich auf jeden Fall.
Außerdem habe ich es nun geschafft “Tomcat 5″ aus der Addison Wesley ‘open source library’ (geschrieben von Mozcar) fertig durchzulesen.
Ist meiner Meinung nach eines der besten Bücher, die mir unter die Hände gekommen sind. Wahnsinnig viele Infos zur Tomcat-Konfiguration, zur Servlet-Programmierung, Sicherheitsaspekte, Open-Source-Komponenten usw. usf.
Ich wünsche euch ein schönes Wochenende!
Sag was!