Your SlideShare is downloading. ×
0
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Java EE Development without EJB - and without Spring - Part 1
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java EE Development without EJB - and without Spring - Part 1

2,329

Published on

Quasi über Nacht und von vielen unbemerkt hielt mit CDI ein Standard in Java EE 6 Einzug, dessen enorm positive Auswirkungen auf das Java-EE-Komponenten- und Entwicklungsmodell nicht sofort …

Quasi über Nacht und von vielen unbemerkt hielt mit CDI ein Standard in Java EE 6 Einzug, dessen enorm positive Auswirkungen auf das Java-EE-Komponenten- und Entwicklungsmodell nicht sofort ersichtlich sind. Teil eins der Doppelsession widmet sich daher den wesentlichen Bausteinen von CDI und grenzt dessen stark unterschätzte Technologie von den etablierten Technologien EJB 3.x und Spring ab.

Published in: Technology, Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,329
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
82
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • \n
  • Die Zeit der Java-Framework à la Spring ist vorbei: Java EE 6 ist da!\nhttp://it-republik.de/jaxenter/news/Java-EE-6-und-das-Ende-von-Spring-057299.html\n
  • "Spring vs. Java EE and Why I Don't Care\n„Due to Spring’s early success and adoption, Java EE 5 and Java EE 6 were pushed to greatly simplify the Java EE programming model, increase developer productivity and become much simpler to use than previous versions.“\n
  • \n
  • Ziel: Java EE mit den Ideen von Spring und Co. aber mit Java Bordmitteln!\nWas ist in Teil 1 und was in Teil 2?\n
  • Was ist in Teil 1 und was in Teil 2?\n
  • Was ist in Teil 1 und was in Teil 2?\n
  • Was ist in Teil 1 und was in Teil 2?\n
  • TODO: @Jens \n
  • \n\n
  • \n
  • max. Typensicherheit\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n\n
  • CDI consolidates JSR 250 (common annotations), JSR 330 (javax.inject) and „EJB 3.1 light“ into a unified „POJO“ component model.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Java EE Resourcen (auch DataSources etc\naktuell sind Servlets NICHT injectable!\n\n
  • Java EE Resourcen (auch DataSources etc.)\n\nFor a web application that uses CDI:\nany servlet request has access to active request, session and application scopes, and, additionally \nany JSF request has access to an active conversation scope.\n\nThe request and application scopes are also active:\nduring invocations of EJB remote methods,\nduring EJB timeouts,\nduring message delivery to a message-driven bean, and\nduring web service invocation\n\n
  • Java EE Resourcen (auch DataSources etc.)\n\n
  • \n
  • \n
  • ACHTUNG: Kein Proxy\n
  • \n\n
  • \n
  • Transient vs. Long Running!\nTransient entspricht in etwa einem JSF Request\nLong Running von begin() bis end()\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Wo kommt das her? Aus Producer Methods oder Fields\n
  • - objects are not required to be beans (e.g. a List)\n- concrete type varies at runtime\n- objects require extra initialization\n\n
  • Wo kommt das her? \n
  • \n
  • \n
  • Wo kommt das her? \n
  • TODO: @CurrentUser (inkl. @Named, damit man ihn in JSF nutzen)\n
  • Wo kommt das her? \n
  • TODO: DB \n
  • \n
  • \n
  • Ist noch Zeit? Dann können wir noch Alternatives und New anschauen!\n
  • \nNormalerweise: ambiguous dependency problem\nTODO: Bild austauschen\n
  • \n
  • \n
  • \n
  • \n
  • POJOs mit LifeCycle versehen\n
  • \n
  • \n
  • Stimmt das so? \n
  • \n
  • \n\n
  • CDI consolidates JSR 250 (common annotations), JSR 330 (javax.inject) and „EJB 3.1 light“ into a unified „POJO“ component model.\n
  • \n
  • \n
  • Transcript

    • 1. Java EE Developmentwithout EJB - and without Spring Lars Röwekamp | Teil 1 Jens Schumann | Teil 2
    • 2. Java EE Developmentwithout EJB - and without Spring Lars Röwekamp | Teil 1 Jens Schumann | Teil 2 @mobileLarson @_openknowledge
    • 3. „Frameworks like Spring are really justa bridge between the mistakes of theJ2EE past and the success of theJava EE 6 future.“ (The age of Frameworks is over, Cameron McKenzie)
    • 4. „ D u e t o S p r i n g ’s e a r l ysuccess and adoption, JavaEE 5 and Java EE 6 werepushed to greatly simplify theJava EE programmingmodel, ...“ (Spring vs. Java and why i don‘t care, Eberhard Wolf)
    • 5. J2EE 1.3 (JSR 58): Java EE v5 (JSR 244): September 2001 Mai 2006  Servlet 2.3  Servlet 2.5  JSP 1.2 Spring V1 Spring V3  JSP 2.1 / JSF 1.2  EJB 2.0 Juni 2003 Dezember 2009  EJB 3.001 / 02 03 / 04 05 / 06 07 / 08 09 / 10„Spring“ J2EE 1.4 (JSR 151): Java EE v6 (JSR 316):Oktober 2002 November 2003 Dezember 2009  Servlet 2.4  Servlet 3.0  JSP 2.0  JSP 2.1 MR / JSF 2.0  EJB 2.1 Spring V2  EJB 3.1 Oktober 2006  JPA 2.0  CDI 1.0
    • 6. J2EE 1.3 (JSR 58): Java EE v5 (JSR 244): September 2001 Mai 2006  Servlet 2.3  Servlet 2.5  JSP 1.2 Spring V1 Spring V3  JSP 2.1 / JSF 1.2  EJB 2.0 Juni 2003 Dezember 2009  EJB 3.001 / 02 03 / 04 05 / 06 07 / 08 09 / 10„Spring“ J2EE 1.4 (JSR 151): Java EE v6 (JSR 316):Oktober 2002 November 2003 Dezember 2009  Servlet 2.4  Servlet 3.0  JSP 2.0  JSP 2.1 MR / JSF 2.0  EJB 2.1 Spring V2  EJB 3.1 Oktober 2006  JPA 2.0  CDI 1.0
    • 7. Java Enterprise 2011: the „CDI Way“
    • 8. Base Features Teil 1:Base Features
    • 9. Base Features Teil 1:Base Features
    • 10. Base Features Teil 1: Base Features Alternatives NewSterotypes InjectionQualifier Scope Producer Methods
    • 11. Base FeaturesTeil 2:Cool Stuff
    • 12. Base FeaturesTeil 2:Cool Stuff
    • 13. Base FeaturesTeil 2:Cool Stuff Interceptor Events lose Kopplung No-Tier Extension „fachliche Injection“
    • 14. Dependency Injection• selbst in Java EE ein alter Hut!• Aber eigentlich schichten- spezifisches Resource & Infrastructure Injection– @ManagedProperty– @EJB– @PersistenceContext– @Resource
    • 15. Wunschkonzert• Standardisiertes DI für Java (SE/EE) – max. Reuse – max. Testbarkeit – max. Flexibilität – Type „Awareness“ – Lifecycle „Awareness“• Fachlichkeit statt Infrastruktur
    • 16. Wunschkonzert... und natürlichErweiterbarkeit • Standardisiertes DI für Java (SE/EE) – max. Reuse – max. Testbarkeit – max. Flexibilität – Type „Awareness“ – Lifecycle „Awareness“ • Fachlichkeit statt Infrastruktur
    • 17. Sp Spr rin S eam ing g uice „CDI Sfür Java EE“ pr G in a.k.a. gJSR 299 euic Se am
    • 18. CDI für Java EE Java SE Java EEJSR-330 JSR-299Dependency uses Context & DependencyInjection for Java Injection for the Java EE platform
    • 19. CDI Bausteine• Typensicheres DI – Types, Qualifier• Lose Kopplung – Events, Interceptors, Decorators• Sichtbarkeiten – Context, Scopes – Lifecycle Awareness
    • 20. JSR 330 Annotationen• @Inject• @Qualifier• @Named (für EL)• @Scope• @Singleton• Provider <T>
    • 21. JSR 299 Annotationen• @RequestScoped• @SessionScoped• @ApplicationScoped• @ConversationScoped• @Dependent• @New• @Produces• @Alternative
    • 22. CDI Managed Bean@Named(“hello“)@RequestScopedpublic class HelloBean { @Inject Greeter greeter; private String name; public String getGreeting() { return greeter.greet(name); } // getter and setter for name attribute ...}
    • 23. CDI Managed Bean „hello“ für EL@Named(“hello“)@RequestScopedpublic class HelloBean { gültig für Request @Inject Greeter greeter; private String name; Injection Point public String getGreeting() { return greeter.greet(name); } // getter and setter for name attribute ...}
    • 24. CDI Managed Bean „hello“ für EL @Named(“hello“) @RequestScoped public class HelloBean { gültig für Request? @Inject Greeter greeter; private String name; Injection Point public String getGreeting() { return greeter.greet(name); } // getter and setter for name attribute ... }
    • 25. CDI Managed Bean Simple POJOpublic class Greeter { public String greet(Sting name) { if (name != null) { return “Hello, “ + name; } else { return “Hello, stranger!“; } }}
    • 26. CDI Managed Bean Stateless EJB@Statelesspublic class GreeterEJB implements Greeter { @Inject Logger logger; @Resource SessionContext context; public String greet(Sting name) { logger.log(Level.INFO, context. getCallerPrincipal().getName()); if (name != null) { ... // create & return greeting } }}
    • 27. Injection Points Field Injection@Injectprivate Greeter greeter; Constructor Injection@Injectpublic HelloBean(Greeter greeter) { this.greeter = greeter;} Setter Injection@Injectpublic void setGreeter(Greeter greeter) { this.greeter = greeter;}
    • 28. CDI Injection• Injection Points – POJOs – Session Beans – Servlets, JAX-RS/WS• Injectable Typen – POJOs – Session Beans – Java EE Ressourcen
    • 29. CDI Scopes• Context/Scope aware – sensitive Injection – Instance Sharing – Container Cleanup >> Request >> Conversation >> Session >> Application >> Dependent
    • 30. CDI Scopes• Context/Scope aware – sensitive Injection – Instance Sharing – Container Cleanup >> Request >> Conversation >> Session >> Application >> Dependent
    • 31. Request ScopeRequest 1 @Inject @RequestScoped @RequestScoped class MyBeanA class MyModel @Inject @RequestScoped class MyBeanBRequest 2 @Inject @RequestScoped @RequestScoped class MyBeanB class MyModel
    • 32. Session Session Scope Request 1 @RequestScoped class MyBeanA @Inject @Inject @RequestScoped @SessionScoped class MyBeanB class MyModel Request 2 @Inject @RequestScoped class MyBeanB
    • 33. Dependent Scope (Default)Request 1 @Inject @RequestScoped @Dependent class MyBeanA class MyModel @Inject @SessionScoped @Dependent class MyBeanB class MyModel
    • 34. CDI Scopes• Dependent – Default Scope – Erzeugung bei Injection – Zerstörung mit Injector – oft sinnvoll >> KEIN Proxy
    • 35. Session Conversation Scope Request 1 @Inject @RequestScoped @ConversationSoped class MyBeanA class MyWizard @Inject Conversation conv; Request 2 // inside „start“ Methode conv.begin(); @RequestScoped class MyBeanB // inside „end“ Methode conv.end(); @Inject
    • 36. CDI Scopes• Conversation – Start- und Endpunkt – ein/mehrere Requests – isoliert von anderen Conversations >> Proxy >> Timeout Support >> Browser Tab Support
    • 37. Stereotypes@Named@RequestScopedpublic class ModelBean { ...}
    • 38. Stereotypes@Model@Named@RequestScopedpublic class ModelBean { ...}
    • 39. Stereotypes@Model@Named@RequestScopedpublic class ModelBean { ...}@Named@RequestScoped@Stereotype@Target(TYPE, METHODE, FIELD)@Retention(RUNTIME)public @interface Model { }
    • 40. Stereotypes@Model@Named@RequestScopedpublic class ModelBean { ...} Wow! Spec „self-made“ @@Named@RequestScoped@Stereotype@Target(TYPE, METHODE, FIELD)@Retention(RUNTIME)public @interface Model { }
    • 41. Qualifier• Problem: Mehr als eine Implementierung eines Interfaces ist vorhanden• Lösung: Qualifier als „Marker“ zur Differenzierung der Implementierungen
    • 42. Qualifierpublic class TransientShoppingCart implements ShoppingCartpublic class PersistentShoppingCart implements ShoppingCart
    • 43. Qualifierpublic class TransientShoppingCart implements ShoppingCartpublic class PersistentShoppingCart implements ShoppingCart@Inject ShoppingCart cart;
    • 44. Qualifier public class TransientShoppingCart implements ShoppingCart public class PersistentShoppingCart implements ShoppingCart? @Inject ShoppingCart cart;
    • 45. Qualifier@Transientpublic class TransientShoppingCart implements ShoppingCart@Persistentpublic class PersistentShoppingCart implements ShoppingCart
    • 46. Qualifier@Transientpublic class TransientShoppingCart implements ShoppingCart@Persistentpublic class PersistentShoppingCart implements ShoppingCart@Inject @Persistent ShoppingCart cart;
    • 47. Qualifier Cool, aber was sind dieMehrwert Use Cases?
    • 48. Qualifier// inject a dedicated version of INFRASTRUCTURE@Inject @UserDB EntityManager userDB;@Inject @ArticleDB EntityManager artDB;// inject the current logged in user@Inject @Current User currentUser;// inject a dedicated version of BUSINESS LOGIC@Inject @Members List<User> memberList;@Inject @Candidates List<User> candidateList;
    • 49. Qualifier // inject a dedicated version of INFRASTRUCTURE @Inject @UserDB EntityManager userDB;? @Inject @ArticleDB EntityManager artDB; // inject the current logged in user @Inject @Current User currentUser; // inject a dedicated version of BUSINESS LOGIC @Inject @Members List<User> memberList; @Inject @Candidates List<User> candidateList;
    • 50. Producer• Idee:• Generelle Basis für typesafe injectable Objekte, ähnlich wie Factory Method nur „more loosely coupled“
    • 51. Qualifier & Producer// inject a dedicated version of INFRASTRUCTURE@Inject @UserDB EntityManager userDB;@Inject @ArticleDB EntityManager artDB;// inject the current logged in user@Inject @Current User currentUser;// inject a dedicated version of BUSINESS LOGIC@Inject @Members List<User> memberList;@Inject @Candidates List<User> candidateList;
    • 52. Qualifier & Producer Producer Methodpublic class DataBaseFactory { @PersistenceContext(unitName=“userDB“) EntityManager userEntityManager; @PersistenceContext(unitName=“articleDB“) EntityManager entityManager; @Produces @UserDB public EntityManager createUserDB() { userEntityManager } @Produces @ArticleDB public EntityManager createArticleDB() { articleEntityManager }
    • 53. Qualifier & Producer Producer Fieldpublic class DataBaseFactory { @Produces @PersistenceContext(unitName=“userDB“) @UserDB EntityManager userEntityManager; @Produces @PersistenceContext(unitName=“articleDB“) @UserDB EntityManager articleEntityManager; ...}
    • 54. Qualifier & Producer// inject a dedicated version of INFRASTRUCTURE@Inject @UserDB EntityManager userDB;@Inject @ArticleDB EntityManager artDB;// inject the current logged in user@Inject @Current User currentUser;// inject a dedicated version of BUSINESS LOGIC@Inject @Members List<User> memberList;@Inject @Candidates List<User> candidateList;
    • 55. Qualifier & Producer@Service /* @SessionScoped */public class UserService { ... @Produces @Current @Named(“loggedInUser“) public User getCurrentUser() { return currentUser; }}
    • 56. Qualifier & Producer BTW: own Stereotype!@Service /* @SessionScoped */public class UserService { ... @Produces @Current @Named(“loggedInUser“) public User getCurrentUser() { return currentUser; }}
    • 57. Qualifier & Producer// inject a dedicated version of INFRASTRUCTURE@Inject @UserDB EntityManager userDB;@Inject @ArticleDB EntityManager artDB;// inject the current logged in user@Inject @Current User currentUser;// inject a dedicated version of BUSINESS LOGIC@Inject @Members List<User> memberList;@Inject @Candidates List<User> candidateList;
    • 58. Qualifier & Producer@Service /* @SessionScoped */public class UserService { ... @Produces @Members public List<User> getMembers() { ... } @Produces @Candidates public List<User> getCandidates() { ... }
    • 59. Qualifier & Producer BTW: own Stereotype!@Service /* @SessionScoped */public class UserService { ... @Produces @Members public List<User> getMembers() { ... } @Produces @Candidates public List<User> getCandidates() { ... }
    • 60. Qualifier & Producerpublic class ProductService { ... @Produces @Named(“bestseller“) @ApplicationScoped @Popular public List<Product> getMostPopularProducts() { // go to DB/cache & fetch most popular products ... }}
    • 61. Qualifier & Producer BTW: useable in JSFpublic class ProductService { ... @Produces @Named(“bestseller“) @ApplicationScoped @Popular public List<Product> getMostPopularProducts() { // go to DB/cache & fetch most popular products ... }}
    • 62. FACHLICHE Injektion statt „nur“Infrastruture Injection
    • 63. Alternatives• Problem:• Unterschiedliche Deployment- Szenario benötigen verschiedene Implementierungen• Lösung:• CDI Alternatives plus beans.xml Eintrag
    • 64. Alternativespublic class RealLifeShoppingCart implements ShoppingCartpublic class MockUpShoppingCart implements ShoppingCart@Inject ShoppingCart shoppingCart;
    • 65. Alternativespublic class RealLifeShoppingCart implements ShoppingCart@Alternativepublic class MockUpShoppingCart implements ShoppingCart@Inject ShoppingCart shoppingCart;
    • 66. Alternatives Two „alternatives“public class RealLifeShoppingCart implements ShoppingCart@Alternativepublic class MockUpShoppingCart implements ShoppingCart@Inject ShoppingCart shoppingCart;
    • 67. Alternatives<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://java.sun.com/xml/ns/javaee"       xmlns:xsi="..."       xsi:schemaLocation="...">   <alternatives>       <class>MockUpShoppingCart</class>   </alternatives></beans>
    • 68. Alternatives Choose YOUR alternative<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://java.sun.com/xml/ns/javaee"       xmlns:xsi="..."       xsi:schemaLocation="...">   <alternatives>       <class>MockUpShoppingCart</class>   </alternatives></beans>
    • 69. New• Problem:• Jeder Aufruf benötigt Injection einer neuen Instanz mit eigenem LifeCycle• Lösung:• Regulären Context durch @New Annotation umgehen.
    • 70. New@Servicepublic class OrderService { ... @Produces @ConversationScoped @Special public Order getSpecialOrder(@Inject Order order) { ... }
    • 71. New@Servicepublic class OrderService { ... @Produces @ConversationScoped ?! @Special public Order getSpecialOrder(@Inject Order order) { ... }
    • 72. New@Servicepublic class OrderService { ... @Produces @ConversationScoped @Special public Order getSpecialOrder( @New Order order) { ... }
    • 73. New@Servicepublic class OrderService { ... @Produces @ConversationScoped @Special public Order getSpecialOrder( @New(PersistentOrder.class) Order order) { ... }
    • 74. ZwischenfazitCDI ermöglicht ... “Java Enterprise Development without EJB - and without Spring“CDI bietet dafür ... typesafe und schichtenneutrales Injection Framework - inkl. des dafür notwendigen Lifecycle Management - und einem Mechanismus zur individuellen Erweiterung
    • 75. Sie wollen Voodoo? Dann kommen sie zu „CDI - Teil 2“! 17:30 Uhr - 18:30 Uhr Jens Schumann gleicher Ort
    • 76. Gibt es nochFragen?Dann los ...

    ×