Thursday, 17 July 2014

Exception durch jaxws-maven-plugin

Maven 3.0.4
jaxws-maven-plugin 2.3

Meine Überraschung war ziemlich groß als ich ein Projekt, das sich in einem Eclipse Workspace wunderbar mit Maven bauen lies plötzlich, als ich es in einen anderen importierte (anderes Eclipse) plötzlich diesen Fehler schmiss:

java.lang.AssertionError cannot be cast to java.lang.Exception

Grund war die Java Version, ab JDK 7u40 wird in JAXP (v1.5) genauer geprüft, somit gehen gewisse wsdl nicht mehr durch. Ausweg bietet sich folgender an:

org.jvnet.jax-ws-commons jaxws-maven-plugin 2.3 generate-sources wsimport -Djavax.xml.accessExternalSchema=all


Wednesday, 13 November 2013

WSDL Location im generierten WebServiceClient passt nicht

Maven 3.0.4
jaxws-maven-plugin 2.1

Generiert man sich aus einem wsdl mit Maven über jaxws-maven-plugin den Client bastelt er einen einen schönen Konstruktor für den Aufruf des Services, der auch funktioniert, wenn man ihn an Ort und Stelle ausprobiert.

Deployed man das dann jedoch auf einen Server geht nichts mehr:
ERROR MyServiceImpl - Service method 'public abstract MyClass myMethod()' threw an unexpected exception: javax.xml.ws.WebServiceException: The following WSDL exception occurred: WSDLException: faultCode=WSDL4JWrapper : : javax.wsdl.WSDLException: WSDLException: faultCode=WSDL4JWrapper : : java.io.FileNotFoundException: unsinnigerPfadzurWSDL (A file or directory in the path name does not exist.)
Der Pfad wird irgendwie unsinnig zusammengesetzt, weil man den default Konsturktor des Services verwendet hat, es gibt aber noch einen zweiten:
MyWebService(URL wsdlLocation, QName serviceName)
Hier kann man sich den Pfad nun selber zusammenbasteln:
MyWebService svc = new MyWebService (WebServiceUtil.class.getClassLoader().getResource("wsdl/MyWSDL.wsdl"), new QName(diesen Teil aus dem default Konstruktor einfach kopieren));
Auf diese Weise wird das wsdl File immer gefunden, egal wo man das Projekt deployed.



Friday, 5 July 2013

JMeter und JSF 1.2

JMeter 2.9
JSF 1.2

Bei JSF 1.2 Applikationen gibt es für JMeter ein paar Hürden, ein paar konnte ich lösen:

1. Bei JSF 1.2 Applikationen werden für die *.jsf Requests Redirects ausgeführt die im Script vorhanden sind --> die Redirects werden also 2x ausgeführt

Lösung: Redirects händisch von den Requests entfernen:


2. Schon das Logon klappt nicht im Script, es wirft einen 404.

Lösung: HTTP Authorisierungs Manager hinzufügen




3. Manche jsf Seiten werfen einen 500er obwohl eigentlich alles zu stimmen scheint, typischer Stacktrace:

javax.servlet.ServletException: viewId:/person.jsf - View /person.jsf could not be restored.
at java.lang.Throwable.<init>(Throwable.java:80)
Wenn man mit JMeter Proxy das Script aufgenommen hat ist zwar der javx.faces.ViewState als Param im Request aufgenommen, aber durch verschiedene widrige Umstände wie zB die Redirects aus dem ersten Tip müssen die stateViews nicht mehr übereinstimmen. Abhilfe schafft hier ein Regular Expression Extractor:



So holt man sich den ViewState aus den Responses:



Und so stopft man diese Variable in die eigenen Requests:




Thursday, 28 February 2013

GWT: TabLayoutPanel wird im IE nicht angezeigt

GWT 2.5

Immer wieder der IE, diesmal in allen von mir getesteten Versionen (7, 8, 9, 10).
Die Tableiste wurde nicht angezeigt, Lösung war bei der Erzeugung des TabLayoutPanel die Unit nicht in EM sondern in PX anzugeben. Gefunden habe ich die Lösung hier: Google Code - Issue 6506: TabLayoutPanel UiBinder Tabs aren't displayed in IE9

Monday, 25 February 2013

GWT: SuggestBox und Tabulator KeyStroke in der CellTable

GWT 2.5

In letzter Zeit handelten meine Beiträge größtenteils von CellTable und SuggestBox und auch diesmal geht es so weiter. Folgende Problemstellung: Ich habe in der Table die Möglichkeit geschaffen daß man mit Tab-Sprüngen die Zellen wechselt, hier der Link dazu wie man das macht: stackoverflow Frage + Antwort.

Nun ist es aber mal so, das wenn man mit Tab die Zelle wechselt der KeyUp Event schon in der neuen Zelle stattfindet und hier beginnen die Probleme: Die SuggestBox glaubt durch das KeyUp das der User etwas in der TextBox verändert hat und läuft gleich mal los um Vorschläge einzuholen... für meine Erfordernisse ganz und gar unnötig bzw. will ich nicht daß der im Feld stehende Wert gleich mal dazu verwendet wird Services aufzurufen.

Die SuggestBox behandelt das in der privaten Methode addEventsToTextBox(), und da privat kann man das Teil nicht einfach überschreiben. Eine Möglichkeit ist es nun die gesamte Klasse zu kopieren und bei der Behandlung des KeyUp Events den Tab KeyStroke daran zu hindern die Methode refreshSuggestions() aufzurufen. Das funktioniert, nur ist das Kopieren ganzer Klassen für eine Zeile Änderung und die Übernahme der Package Struktur (notwendig weil die SuggestBox auf protected Teile im Package com.google.gwt.user.client.ui zugreift) einfach nur gruselig.

Ich habe mich deshalb entschlossen der TextBox einen KeyUpHandler hinzuzufügen der der Textbox die Möglichkeit gibt sich zu merken welcher Key losgelassen wurde. Das verwende ich nun in meinem SuggestOracle in der Methode requestSuggestions. Den gesamten Code der Implementierung kann man sich  aus meinen vorherigen Beiträgen zusammenreimen, hier die aktuell nötigen Änderungen damit das ganze klappt:

Hier die erweiterte TextBox die ich dann zum Erzeugen meiner SuggestBox verwende:

 private class MyTextBox extends TextBox {
  public int currentKeyUpStroke;
  private MyTextBox(Element element) {
   super(element);
   this.addKeyUpHandler(new KeyUpHandler() {
    @Override
    public void onKeyUp(KeyUpEvent event) {
     MyTextBox.this.currentKeyUpStroke = event.getNativeKeyCode();
    }
   });
  }
  public int getCurrentKeyUpStroke() {
   return currentKeyUpStroke;
  }
 }


Und hier die Stelle wo ich, bevor ich meine Services aufrufe, überprüfe ob nicht etwa ein Tab der Auslöser des ganzen war:

 private SuggestOracle getSuggestOracle() {
  final SuggestOracle so = new SuggestOracle() {

   @Override
   public void requestSuggestions(final Request request, final Callback callback) {

    if (request.getQuery().length() > 3
      && ((MyTextBox) RegeldatenTextInputCell.this.suggestBox.getTextBox()).getCurrentKeyUpStroke() != KeyCodes.KEY_TAB) {