Archiv der Kategorie: cool eclipse

Wenn ich dieses Jahr nur ein Buch gelesen hätte…

dann wäre das „Essential Skills for Agile Development“.

Selten habe ich ein so wertvolles und durchdachtes Buch in der Hand gehabt.
Das Buch besteht im Prinzip nur aus Source-Code, Übungen und Lösungsvorschlägen für alltägliche Probleme in unserer Arbeit, und ich hab Sie alle schon in echtem Code gesehen…

Ich habe es jedem in meinem Team nahegelegt, dieses Buch zu lesen und die Übungen zu machen. Ich hoffe, das macht sich demnächst auch im Code bemerkbar:).

Das Buch ist kostenlos und hier zu finden.

Obwohl erst Anfang Dezember ist, das ist mein „Buch des Jahres 2012“.

Advertisements

Erster Screencast – EffectiveTrainings.de auf YouTube

Hi,

gerade habe ich meinen ersten Versuch für die EffectiveTrainings.de Screencasts veröffentlicht.

Ich übe noch mit FinalCut Pro und AfterEffects:).


War dieser Blogeintrag für Sie interessant? Evtl. kann ich noch mehr für Sie tun.

Trainings & Know-How aus der Praxis zu

  • Apache Wicket 1.4.x, 1.5.x, 1.6.x
  • GIT – Best Practices, Einsatz, Methoden
  • Spring
  • Java
  • Scrum & Kanban
  • Agiles Arbeiten
Consulting & Softwareentwicklung

  • Requirements Engineering
  • Qualitätssicherung
  • Software-Entwicklung
  • Architektur
  • Scrum & Kanban

MetadataMBeanInfoAssembler does not support JDK dynamic proxies – Eine der ekelhaftesten Spring Exceptions.

Das exportieren von MBeans mit Spring ist kinderleicht und macht Spaß!

Folgende Exception hat mich und auch einige Kollegen (hallo David!:)) kürzlich einige Nerven gekostet.


Caused by: java.lang.IllegalArgumentException: MetadataMBeanInfoAssembler does not support JDK dynamic proxies - export the target beans directly or use CGLIB proxies instead
at org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler.checkManagedBean(MetadataMBeanInfoAssembler.java:105)
at org.springframework.jmx.export.assembler.AbstractMBeanInfoAssembler.getMBeanInfo(AbstractMBeanInfoAssembler.java:63)
at org.springframework.jmx.export.MBeanExporter.getMBeanInfo(MBeanExporter.java:819)
at org.springframework.jmx.export.MBeanExporter.createAndConfigureMBean(MBeanExporter.java:792)

Um dies nachzustellen definieren wir folgenden Spring-Context:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<bean id="transactionManager">
<property name="userTransaction" ref="dummyTransaction"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

<context:mbean-export/>
<context:mbean-server id="mBeanServer"/>
<context:component-scan base-package="de.effective"/>
</beans>

Dieses Service-Interface:


public interface MyService {
public void sagDochMal(String was);
}

Und diese Implementierung:


@Component
@ManagedResource(objectName="effective:name=laberService")
@Transactional
public class MyServiceImpl implements MyService {
@Override
@ManagedOperation()
public void sagDochMal(String was) {
System.out.println("Ich sag " + was);
}
}

Startet man die Testapplikation


/**
* @author martin.dilger
*/
public class SpringApplication {

public static void main(String[] args) throws Exception {

new Thread(new Runnable() {
@Override
public void run() {
ClassPathXmlApplicationContext appCtx = new ClassPathXmlApplicationContext("de/effective/spring-context.xml");

MyService myService = appCtx.getBean(MyService.class);
myService.sagDochMal("Heureka, ich habs!");
while(true)
try {
Thread.sleep(1000);
System.out.println("still running");
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}).start();       ;

}
}

kriegt man direkt eine Exception vor den Latz geknallt:


Exception in thread "Thread-0" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mbeanExporter': Invocation of init method failed; nested exception is org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [de.effective.MyServiceImpl@3adec164] with key 'myServiceImpl'; nested exception is org.springframework.jmx.export.MBeanExportException: Could not create ModelMBean for managed resource [de.effective.MyServiceImpl@3adec164] with key 'myServiceImpl'; nested exception is java.lang.IllegalArgumentException: MetadataMBeanInfoAssembler does not support JDK dynamic proxies - export the target beans directly or use CGLIB proxies instead
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at de.effective.SpringApplication$1.run(SpringApplication.java:17)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [de.effective.MyServiceImpl@3adec164] with key 'myServiceImpl'; nested exception is org.springframework.jmx.export.MBeanExportException: Could not create ModelMBean for managed resource [de.effective.MyServiceImpl@3adec164] with key 'myServiceImpl'; nested exception is java.lang.IllegalArgumentException: MetadataMBeanInfoAssembler does not support JDK dynamic proxies - export the target beans directly or use CGLIB proxies instead
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:602)
at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:527)
at org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBeanExporter.java:413)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 13 more
Caused by: org.springframework.jmx.export.MBeanExportException: Could not create ModelMBean for managed resource [de.effective.MyServiceImpl@3adec164] with key 'myServiceImpl'; nested exception is java.lang.IllegalArgumentException: MetadataMBeanInfoAssembler does not support JDK dynamic proxies - export the target beans directly or use CGLIB proxies instead
at org.springframework.jmx.export.MBeanExporter.createAndConfigureMBean(MBeanExporter.java:797)
at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:654)
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:592)
... 17 more
Caused by: java.lang.IllegalArgumentException: MetadataMBeanInfoAssembler does not support JDK dynamic proxies - export the target beans directly or use CGLIB proxies instead
at org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler.checkManagedBean(MetadataMBeanInfoAssembler.java:105)
at org.springframework.jmx.export.assembler.AbstractMBeanInfoAssembler.getMBeanInfo(AbstractMBeanInfoAssembler.java:63)
at org.springframework.jmx.export.MBeanExporter.getMBeanInfo(MBeanExporter.java:819)
at org.springframework.jmx.export.MBeanExporter.createAndConfigureMBean(MBeanExporter.java:792)
... 19 more

Quizfrage:

Was muss man tun, um die Applikation startbar zu machen und woran liegts?

Die Sourcen gibts übrigens auch auf github: git@github.com:dilgerma/playground.git im Unterverzeichnis spring-riddle.

Die Lösung ist sehr, sehr einfach, aber man muss drauf kommen.

Hier nochmals der spring-context:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<bean id="transactionManager">
<property name="userTransaction" ref="dummyTransaction"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

<context:mbean-export/>
<context:mbean-server id="mBeanServer"/>
<context:component-scan base-package="de.effective"/>
</beans>

Der Trick ist folgender:

Die beiden Direktiven <context:mbean-export/> und
<context:component-scan base-package=“de.effective“/> sind in der falschen Reihenfolge im spring-context deklariert.

Dadurch, dass die Beans am Transaktionsmanagement teilnehmen erzeugt Spring Proxy-Klassen für die Beans. Proxy-Klassen dürfen aber nicht
als MBeans registriert werden (warum genau weiß ich nicht).
Dreht man die Reihenfolge um, funktioniert das Ganze.


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<bean id="transactionManager">
<property name="userTransaction" ref="dummyTransaction"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<context:component-scan base-package="de.effective"/>
<context:mbean-export/>
<context:mbean-server id="mBeanServer"/>
</beans>

Die Reihenfolge im Spring-Context spielt also tatsächlich eine Rolle! MBean-Deklarationen sollten immer möglichst weit
unten im Spring-Context platziert werden.

Es gibt haufenweise Einträge mit diesem Problem und mindestens eben so viele Lösungsvorschläge:), beispielsweise hier:

http://forum.springsource.org/showthread.php?14349-My-JMX-beans-no-longer-work-in-RC2

http://nelz.net/2008/10/10/spring-jmx-challenges/


War dieser Blogeintrag für Sie interessant? Evtl. kann ich noch mehr für Sie tun.

Trainings & Know-How aus der Praxis zu

  • Apache Wicket 1.4.x, 1.5.x, 1.6.x
  • GIT – Best Practices, Einsatz, Methoden
  • Spring
  • Java
  • Scrum & Kanban
  • Agiles Arbeiten
Consulting & Softwareentwicklung

  • Requirements Engineering
  • Qualitätssicherung
  • Software-Entwicklung
  • Architektur
  • Scrum & Kanban

Daily Intellij – a good Idea

Hallo,

vor einiger Zeit habe ich hier angekündigt, dass ich testweise auf Intellij IDEA umsteigen werde, ein anfangs schwerer Schritt, der sich aber mittlerweile gelohnt hat.

Ich habe noch nie so produktiv gearbeitet, und ich habe noch nie mit einem so guten Werkzeug wie IntelliJ gearbeitet.

Nicht zuletzt für mich zur Dokumentation möchte ich hier meine Arbeitsweise mit IntelliJ dokumentieren, da dies den Einstieg und vor allem wahrscheinlich auch den Umstieg erheblich erleichtert.

Tastaturkürzel in aller Kürze – hier sind die wichtigsten Tastenkürzel dokumentiert, mit denen ich tagtäglich arbeite (natürlich kann man die auch in der Tastenkürzel-Übersicht finden, aber davon braucht man anfangs nur sehr, sehr wenige).

Zu allen Interfaces kann man eine Implementierung finden über:

Der wahrscheinlich wichtigste Shortcut:

Damit kann jede beliebige Aktion in IntelliJ direkt ausgeführt werden – fast so schnell wie ein Shortcut – aber definitiv schneller als die Maus:

STRG + SHIFT + A

 

Markieren + STRG+ALT+B  – findet die Implementierung zu einem Interface oder abgeleitete Klassen.

Methode markieren + STRG+ALT+H – findet alle Aufrufer dieser Methode

 Variable markieren + ALT+F3 – markiert alle Verwendungen dieser Variable.

Mit F3 – springt man jeweils zum nächsten markierten Punkt

Mit Shift-F3 zum jeweils vorherigen

 

 

SHIFT-ALT-F – sucht im gesamten Projekt / Verzeichnis – enorm schnell und performant

 

 

 

 

 

 

 

 

Test markieren +SHIFT+F10 – Test ausführen (bzw. egal was markiert ist ausführen)
                                                                               Test markieren + SHIFT + F9 – Debuggen!

STRG+ALT+LINKS bzw. RECHTS – zur letzten Editieroption zurück bzw. vorspringen (extrem nützlich!).

 

 STRG + O – Zeigt alle Methoden an, die überschrieben werden können.

 

 

 

 

 

 

 

STRG + F12 – zeigt alle Methoden und Variablen einer Klasse

 

 

 

 

Mit STRG+SHIFT+A und der Shortcut-Refcard sollte man relativ schnell relativ weit kommen.

Viel Spaß damit!

 

 


War dieser Blogeintrag für Sie interessant? Evtl. kann ich noch mehr für Sie tun.

Trainings & Know-How aus der Praxis zu

  • Apache Wicket 1.4.x, 1.5.x, 1.6.x
  • GIT – Best Practices, Einsatz, Methoden
  • Spring
  • Java
  • Scrum & Kanban
  • Agiles Arbeiten
Consulting & Softwareentwicklung

  • Requirements Engineering
  • Qualitätssicherung
  • Software-Entwicklung
  • Architektur
  • Scrum & Kanban

Eclipse Shortcuts – Top 12

Hallo,

da ich in nächster Zeit vorwiegend mit IntelliJ Idea arbeiten werde, dokumentiere ich hier mal meine wichtigsten Eclipse Shortcuts die ich ständig verwende, hauptsächlich, damit ich sie auch wieder finde, wenn ich wieder mit Eclipse arbeiten sollte:).

Strg – 3 : Wichtigster Shortcut überhaupt, bietet eine dynamische Eingabemöglichkeit zu allen Views, Editoren etc.

Strg – T : Vererbungshierarchie einer Klasse

Strg – Alt – H : finde alle Klasse, die einen Markierten Typen oder eine Methode verwenden

Alt-Shift-X + T : Führe alle Unit Tests aus bzw. den markierten Unit-Test

Alt-Shift-X + N : Führe alle test-NG Tests bzw. den markierten Test-NG Test aus

Alt-Shit-X + ? : Generell praktischer Shortcut

Strg + J : Spring zum Unit-Test und zur Klasse zurück  (nur in Verbindung mit MoreUnit Plugin)

Alt+Up bzw. Down : Zeile im Editor nach oben bzw. nach unten verschieben

Strg + O : Outline im Editor

Alt+Shift+R: Markierte Klasse oder Methode umbenennen

Strg + 7 : Zeilen einkommentieren

Habt ihr noch wichtige Shortcuts, die ich hier vergessen habe?

Generell kann ich sagen, dass ich mit Eclipse jetzt seit mehr als 4 Jahren zufrieden gearbeitet habe, zuletzt mit dem Eclipse Juno Milestone 5.

Ich denke trotzdem, es ist an der Zeit, etwas neues auszuprobieren, und meine Wahl ist auf IntelliJ gefallen.


War dieser Blogeintrag für Sie interessant? Evtl. kann ich noch mehr für Sie tun.

Trainings & Know-How aus der Praxis zu

  • Apache Wicket 1.4.x, 1.5.x, 1.6.x
  • GIT – Best Practices, Einsatz, Methoden
  • Spring
  • Java
  • Scrum & Kanban
  • Agiles Arbeiten
Consulting & Softwareentwicklung

  • Requirements Engineering
  • Qualitätssicherung
  • Software-Entwicklung
  • Architektur
  • Scrum & Kanban