Samstag, 20. Juni 2009

XHTML in Eclipse validieren

Ich bin derzeit am Erstellen einer Webapplikation mit JSF. Dabei benutze ich Facelets und somit .xhtml-Seiten anstatt der herkömlichen .jsf-Seiten. Die normale Eclipse Ganymede Installation unterstützt allerdings erstmal im Web page editor keine Validierung von XHTML. Auch die Auto-Vervollständigung mittels Code Assistent will nicht so, wie man es gewohnt ist. Diese Probleme kann man jedoch ändern unter
  • Windows
  • Preferences
  • General
  • Content Types
  • JSP
  • File associations -> Add...
Da ich das für sehr nützlich halte und selbst immer mal wieder darüber stolpere, poste ich diese Info zusammen mit dem Screenshot kurz an dieser Stelle. Kann aber durchaus sein, daß das Editieren mit den JBoss Tools noch komfortabler von statten geht. Nur sind diese nicht immer in jedem Eclipse installiert.


Desweiteren bin ich mir nicht sicher, einen Tipp in dieser Arbeit bereits einmal bei javathreads.de nachgelesen zu haben. Falls mich mein Gedächtnis trügt, lohnt es sich dennoch trotzdem, ab und an bei diesem Blog vorbeizusehen ;) Ich jedenfalls halte es für einen großen Vorteil, mit RSS-Feeds zu arbeiten und sich bei vielen guten Java-Seiten und Blogs auf dem Laufenden zu halten. Das erweitert das Wissen um Java ungemein. Wer ein Google Konto besitzt, kann dafür gleich auf seiner personalisierten iGoogle-Startseite den NewsReader sowie GoogleMail angezeigt bekommen und im NewsReader sogar anhand von Begriffen nach Artikeln über seine abonnierten Quellen suchen lassen. Aber ich schweife ab... ;)

Donnerstag, 18. Juni 2009

Webservices mit EJB3

In einem schon etwas älteren Artikel bin ich bereits auf das Arbeiten mit JPA / EJB3 eingegangen. Ziel war es, mit Entity Beans Datenbanktabellen generieren zu lassen. In EJB3 Projekten kommen aber neben den Entity Beans natürlich auch Stateless und Statefull Session Beans zum Einsatz. Darin wird die Geschäftslogik gehalten. In diesem Artikel will ich nun etwas kompakt zeigen, wie diese Stateless Session Beans als Webservices genutzt werden können und wie man per SOAP auf diese Webservices zugreifen kann.

Entscheidend sind dabei folgende Annotations, die mal anhand eines Beispieles aufgezeigt werden:


package de.mortensenit.webservicedemo.person.actions;

import java.util.Date;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
* Session Bean implementation class PersonActionDemo
*
* © 2009
*
* @author Frederik Mortensen
*/
@WebService
@SOAPBinding(style = Style.RPC)
@Stateless
public class PersonActionDemo
implements PersonActionDemoLocal,
PersonActionDemoRemote {

/**
* Person maintainance webservice, takes care of inserting and upating the
* person
*
* @param surname
* @param forename
* @param birthdate
* @return
*/
@Override
@WebMethod
public Boolean maintainPersonWS(
@WebParam(name = "surname") String surname,
@WebParam(name = "forename") String forename,
@WebParam(name = "birthdate") Date birthdate) {

// do soemething...
return true;

}

}


Die ersten zwei verwendeten Annotations betreffen dabei die Klasse an sich und lauten:
  • @WebService
  • @SOAPBinding(style=Style.RPC)
Diese Annotations ermöglichen es der Klasse, als Webservice Endpoint zu fungieren, weitere Parameter der Annotation sind optional.

Die eigentliche, aufgerufene Methode des Webservices erhält ebenfalls Annotationen:

  • @WebMethod
  • @WebParam(name="surname")
Mit der WebParam Annotation hat man hier die Möglichkeit, den nach aussen hin sichtbaren Parameter des Webservices umzubenennen und sprechende Namen zu verwenden.

Deployt man nun sein Projekt auf dem Application Server, sieht man in der JBoss Management Console unter "jboss.ws" den eigenen, neu kreierten Endpoint. Desweiteren wird nun von JBoss aus eine WSDL-Datei generiert, welche unter folgendem Pfad erreichbar sein sollte:

http://localhost:8080/{context}/{endpoint}?wsdl (Context und Endpoint sieht man in der Management Console)

Alles, was man nun zu seinem Glück noch braucht, ist ein Webservice Client. Den kann man in den aktuellen IDEs wie Eclipse und NetBeans bereits selbständig generieren lassen. Auch in .NET ist dies vollautomatisch möglich. Wer es in Eclipse ausprobieren möchte, muß zuerst Axis2 installiert haben. In Eclipse sollte man nun unter...

  • Windows
  • Preferences
  • Web Services
  • Axis2 Preferences
die Axis2 Runtime Location angeben. Ist dies einmal gespeichert, steht ein neuer Wizzard zur Verfügung:
  • File
  • New
  • Other
  • Web Service Client
Dort muß unter "Service definition" der Pfad zur WSDL-Datei angegeben werden. Nun wird ein Stub und ein CallbackHandler generiert. Wer statt mit Eclipse lieber den klassischen Weg über die Konsole gehen möchte, kann auch direkt die nötige Batch-Datei aufrufen. Zu finden ist diese unter:

{axis2installordner}\bin\wsdl2java.bat


Ruft man diese Batch-Datei mit dem Parameter -uri auf und gibt den Pfad zur WSDL-Datei an, wird ein src-Ordner erstellt, der ebenfalls Stub und CallbackHandler als generierte Klassen enthält.

Sind also Stub und co. durch den Wizzard erst einmal generiert, kann man folgende Testklasse mit Main-Methode erstellen, um den SOAP-Aufruf durchzuführen:


package de.mortensenit.webserviceclientdemo.person;

import java.rmi.RemoteException;
import java.util.Calendar;
import org.apache.axis2.AxisFault;
import de.mortensenit.webserviceclientdemo.PersonActionDemoServiceStub.MaintainPersonWS;

public class SoapTest {

public static void main(String[] args) {

try {
//filling webservice parameters
MaintainPersonWS webService = new MaintainPersonWS();
webService.setForename("Frederik");
webService.setSurname("Mortensen");
webService.setBirthdate(Calendar.getInstance());

//calling webservice
new PersonActionsServiceStub().maintainPersonWS(webService);
}
catch (AxisFault axisFault) {
axisFault.printStackTrace();
}
catch (RemoteException remoteException) {
remoteException.printStackTrace();
}

}

}


Ruft man nun die Main-Methode auf, wird der Webservice via SOAP aufgerufen und mit den Parametern befüllt, die man ausgewählt hat. Soeben haben Sie Ihren ersten Webservice erstellt. Sollten Probleme oder Fragen auftreten, bin ich gerne bereit, auf Kommentare auch per E-mail zu antworten und zu helfen.

Mögliche Fehlerquellen:
Leider hat mir die bei mir im Einsatz befindliche JBoss-Version jboss-4.2.3.GA echte Bauchschmerzen bereitet mit folgender Exception:


ERROR [SOAPFaultHelperJAXWS] SOAP request exception
java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage

Herausgekommen ist, daß sich diese JBoss-Variante mit der aktuellen Java6-Version nicht verträgt. Es gibt jedoch ein leichtes Workaround. Man muß die von JBoss verwendete Datei {jboss-installordner}\lib\jboss-saaj.jar in das Unterverzeichnis endorsed kopieren. Dies führt dazu, daß die von JBoss mitgelieferte Implementierung der Klasse SOAPMessage vorgezogen wird vor dem installierten JRE.

Quellen:
https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html

Donnerstag, 11. Juni 2009

Auf zu neuen Zielen ... SCBCD

Die Entscheidung ist gefallen! Der Sun Certified Business Components Developer (SCBCD) wartet auf mich. Der SCJP hat meinen Appetit nach mehr geweckt. Außerdem befasse ich mich ja sowieso bereits mit den Thematiken, die Inhalt dieser Prüfung sind. Nur diesmal scheint es etwas schwerer zu werden. Nicht nur aufgrund des neuen Stoffes, sondern leider auch aufgrund der Tatsache, daß es keine aktuellen Bücher als Prüfungsvorbereitung gibt.

Eine Übersicht aller Zertifizierungen findet man hier:
https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/index.html

Die genaue Bezeichnung der von mir gewählten Prüfung lautet:
Sun Certified Business Component Developer for the Java Platform, Enterprise Edition 5 (CX-310-091).

Hierzu empfohlen werden von SUN zwei Schulungen, die man beispielsweise als CD-ROM oder Web-Variante käuflich erwerben kann:
Da ich bisher mit den CD-ROMs als Prüfungsvorbereitung keine Erfahrungen gemacht habe, würde ich mich über ein Feedback und einen Erfahrungsbericht natürlich sehr freuen. Bis dahin kann ich zumindest allen interessierten Lesern schon einmal folgende Links nahelegen, um nähere Informationen zur Prüfungsvorbereitung zu erhalten:

Die Java-Ranch und deren SCBCD-Forum:
http://www.coderanch.com/forums/f-70/EJB-Certification-SCBCD

Der SCBCD 5.0 Study Guide von Mikalai Zaikin:
http://java.boot.by/scbcd5-guide/

Wenn ich weitere Informationen über die Prüfung finde, stelle ich sie hier gerne zur Verfügung. Ich würde mich aber wie schon erwähnt freuen, auch von euch Feedback und Tipps zu erhalten. Allen, die diese Prüfung selbst demnächst in Angriff nehmen, wünsche ich natürlich viel Glück und Erfolg! Oder wie man auf klingonisch (einer Sprache, die Java bereits mit eigenem language code unterstützt) so schön sagt,.. Qapla’!

Mittwoch, 3. Juni 2009

SyntaxHighlighter

Ich habe gerade ein wenig am Blog geschraubt und bin nun glücklicherweise in der Lage, den geposteten Quellcode noch sauberer formatiert anzeigen zu lassen. Inklusive der Möglichkeit, den Quellcode kopieren und ausdrucken zu können sowie mit Anzeige von Zeilennummern. Zu verdanken ist diese Anzeige einem netten und leicht einzubindenden Tool namens SyntaxHighlighter. Zu finden ist es hier:

http://alexgorbatchev.com/wiki/SyntaxHighlighter

Und installierbar ist es umso einfacher. Der folgende Quellcode dient somit gleichzeitig als Installationsanleitung und erste Demo ;) Einfach unter Anpassen in der Menüleiste von blogger auf die Lasche Layout wechseln, dort auf HTML bearbeiten klicken und zu guter Letzt nach dem <head> Tag folgende Zeilen einfügen:


<!-- ANFANG SyntaxHighlighter//-->
<link href="'http://alexgorbatchev.com/pub/sh/2.0.278/styles/shCore.css'" rel="'stylesheet'" type="'text/css'/">
<link href="'http://alexgorbatchev.com/pub/sh/2.0.278/styles/shThemeDefault.css'" rel="'stylesheet'" type="'text/css'/">
<script src="'http://alexgorbatchev.com/pub/sh/2.0.278/scripts/shCore.js'" type="'text/javascript'/">
<script src="'http://alexgorbatchev.com/pub/sh/2.0.278/scripts/shBrushJScript.js'" type="'text/javascript'/">
<script src="'http://alexgorbatchev.com/pub/sh/2.0.278/scripts/shBrushCSharp.js'" type="'text/javascript'/">
<script src="'http://alexgorbatchev.com/pub/sh/2.0.278/scripts/shBrushSql.js'" type="'text/javascript'/">
<script src="'http://alexgorbatchev.com/pub/sh/2.0.278/scripts/shBrushJava.js'" type="'text/javascript'/">
<script src="'http://alexgorbatchev.com/pub/sh/2.0.278/scripts/shBrushXml.js'" type="'text/javascript'/">
<script type="'text/javascript'">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<!-- ENDE SyntaxHighlighter //-->


Wenn man diese Änderungen speichert und beim nächsten Post im HTML-Bearbeitungsmodus das folgende Tag nutzt, erscheint der Quellcode künftig formatiert:

<pre class="brush: java">
public class Test {
private String name = "myName";
}
</pre>


public class Test {
private String name = "myName";
}


Vielleicht habe ich damit ja dem einen oder anderen helfen können.