Reduce to the Max: Lightweight Java EE

90
Java Reduce to the Max Lightway Enterprise Java Lars Röwekamp | open knowledge GmbH @mobileLarson @_openknowledge

description

Speaker: Lars Röwekamp JAX 2013 25.4.2013 Dank Java EE Web Profile, inkl. JSF 2 und CDI, lassen sich moderne Webanwendungen deutlich leichtgewichtiger und eleganter aufbauen als bisher. Die Session zeigt anhand eines Migrationsszenarios, wie in wenigen Schritten aus einer Old-School-JSF-Anwendung eine State of the Art JSF-und-CDI-Anwendung werden kann – positive Nebeneffekte wie schichtenneutrale Validierung inklusive.

Transcript of Reduce to the Max: Lightweight Java EE

Page 1: Reduce to the Max: Lightweight Java EE

Java

Reduce to the MaxLightway Enterprise Java

Lars Röwekamp | open knowledge GmbH

@mobileLarson@_openknowledge

Page 2: Reduce to the Max: Lightweight Java EE

„Weniger ist mehr!“

„Java EE ermöglicht - dank EE Web

Profile - extrem elegante und

l e i c h t g e w i c h t i g e E n t e r p r i s e

Anwendungen“

Was sie mitnehmen sollten ...JSF & CDI Lightway Java EE

Page 3: Reduce to the Max: Lightweight Java EE

„Weniger ist mehr!“

„Java EE ermöglicht - dank EE Web

Profile - extrem elegante und

l e i c h t g e w i c h t i g e E n t e r p r i s e

Anwendungen“

Was sie mitnehmen sollten ...JSF & CDI Lightway Java EE

Page 4: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

Page 5: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

TX

Page 6: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

Page 7: Reduce to the Max: Lightweight Java EE
Page 8: Reduce to the Max: Lightweight Java EE

Ok, wo liegt das Problem?

Page 9: Reduce to the Max: Lightweight Java EE

Heterogene Lösungen

Page 10: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

Page 11: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

eigene DI, Validierung, LifeCycle

eigene DI, Validierung, LifeCycle

eigene DI, Validierung, LifeCycle

Page 12: Reduce to the Max: Lightweight Java EE

Technology drivesBusiness

Page 13: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

TX

UC: „User“ anzeigen/ändern

Page 14: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

TX

Einen JSF ManagedBean

Controller, bitte.

Und für mich einen EJB Service.

Entity X mit ID Y,wenn möglich.

UC: „User“ anzeigen/ändern

Page 15: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

TX

Einen JSF ManagedBean

Controller, bitte.

Und für mich einen EJB Service.

Entity X mit ID Y,wenn möglich.

Hey, ich will doch nur den Current User!

Page 16: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... // some more services needed public String create() { .. }

public String askForDeleteConfirmation() { ... }

public String deleteAfterConfirmation() { ... }

}

Page 17: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... // some more services needed public String create() { .. }

public String askForDeleteConfirmation() { ... }

public String deleteAfterConfirmation() { ... }

}

Layer Solution

Page 18: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... // some more services needed public String create() { .. }

public String askForDeleteConfirmation() { ... }

public String deleteAfterConfirmation() { ... }

}

String basiertes IoC

Layer Solution

Page 19: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... // some more services needed public String create() { .. }

public String askForDeleteConfirmation() { ... }

public String deleteAfterConfirmation() { ... }

}

String basiertes IoC

Infrastrutur Injection

Layer Solution

Page 20: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... // some more services needed public String create() { .. }

public String askForDeleteConfirmation() { ... }

public String deleteAfterConfirmation() { ... }

}

String basiertes IoC

Infrastrutur Injection

Technology Injection

Layer Solution

Page 21: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... // some more services needed public String create() { .. }

public String askForDeleteConfirmation() { ... }

public String deleteAfterConfirmation() { ... }

}

String basiertes IoC

Infrastrutur Injection

String basierte Navi

Technology Injection

Layer Solution

Page 22: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

...

public String create() { if (user.getUsername() == user.getPassword()) { ... // create faces messages return USERNAME_SHOULD_NOT_EQUAL_PASSSWORD; // createUser.xhtml } else if (userService.checkForFreeUsername(user.getUsername())) { userService.create(user); mailService.sendWelcomeMail(user); SystemUser loggedInUser = authenticationController.getLoggedInUser(); if (Role.ROLE_TRAINEE.equals(loggedInUser.getRole()) { trackingService.trackAction(TrackAction.USER_CREATED, user); } return “USER_CREATED“; // or userOverview.xhtml } else { ... // create faces messages return “DUPLICATE_USERNAME“; // or createUser.xhtml } } }

Page 23: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

...

public String create() { if (user.getUsername() == user.getPassword()) { ... // create faces messages return USERNAME_SHOULD_NOT_EQUAL_PASSSWORD; // createUser.xhtml } else if (userService.checkForFreeUsername(user.getUsername())) { userService.create(user); mailService.sendWelcomeMail(user); SystemUser loggedInUser = authenticationController.getLoggedInUser(); if (Role.ROLE_TRAINEE.equals(loggedInUser.getRole()) { trackingService.trackAction(TrackAction.USER_CREATED, user); } return “USER_CREATED“; // or userOverview.xhtml } else { ... // create faces messages return “DUPLICATE_USERNAME“; // or createUser.xhtml } } }

Monster UseCase

Page 24: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable {

...

public String create() { if (user.getUsername() == user.getPassword()) { ... // create faces messages return USERNAME_SHOULD_NOT_EQUAL_PASSSWORD; // createUser.xhtml } else if (userService.checkForFreeUsername(user.getUsername())) { userService.create(user); mailService.sendWelcomeMail(user); SystemUser loggedInUser = authenticationController.getLoggedInUser(); if (Role.ROLE_TRAINEE.equals(loggedInUser.getRole()) { trackingService.trackAction(TrackAction.USER_CREATED, user); } return “USER_CREATED“; // or userOverview.xhtml } else { ... // create faces messages return “DUPLICATE_USERNAME“; // or createUser.xhtml } } }

Monster UseCase

Cross Validation

Page 25: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable{

private User user;

... public String askForDeleteConfirmation(User userToDelete) { user = userToDelete; return “USER_READY_FOR_DELETE“; // userDeleteConfirmation.xhtml }

public String deleteAfterConfirmation() { userService.delete(user); ... // do some more stuff, e.g. sending an email, tracking, ... user = null; return “USER_DELETED“; // userSuccessfulDeleted.xhtml }

}

Page 26: Reduce to the Max: Lightweight Java EE

Der KlassikerJSF & CDI Lightway Java EE

@ManagedBean(name=“userController“) @SessionScoped public class UserControllerMB implements Serializable{

private User user;

... public String askForDeleteConfirmation(User userToDelete) { user = userToDelete; return “USER_READY_FOR_DELETE“; // userDeleteConfirmation.xhtml }

public String deleteAfterConfirmation() { userService.delete(user); ... // do some more stuff, e.g. sending an email, tracking, ... user = null; return “USER_DELETED“; // userSuccessfulDeleted.xhtml }

}

Session statt „Wizard“

Scope Mismatch

Page 27: Reduce to the Max: Lightweight Java EE

Java

Page 28: Reduce to the Max: Lightweight Java EE

Java

U are here!

Page 29: Reduce to the Max: Lightweight Java EE

Java

„We want a typesafe and modern lightway

Enterprise Achritecture.“

Refactoringis needed

Page 30: Reduce to the Max: Lightweight Java EE

Der Klassiker - revistedJSF & CDI Lightway Java EE

Page 31: Reduce to the Max: Lightweight Java EE

Der Klassiker - revistedJSF & CDI Lightway Java EE

Page 32: Reduce to the Max: Lightweight Java EE

Der Klassiker - revistedJSF & CDI Lightway Java EE

Page 33: Reduce to the Max: Lightweight Java EE

Java

„Get ride of all the JSF specific Managed

Beans and Scopes.“

RefactoringStep 1

Page 34: Reduce to the Max: Lightweight Java EE

Refactoring - Step 1 JSF & CDI Lightway Java EE

@javax.faces.bean.ManagedBean(name=“userController“) @javax.faces.bean.SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@javax.faces.ManagedProperty(value=“#{authenticationController}“) private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... }

Page 35: Reduce to the Max: Lightweight Java EE

Refactoring - Step 1 JSF & CDI Lightway Java EE

@javax.inject.Named(“userController“) @javax.enterprise.context.SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@javax.inject.Inject private authControllerMB AuthenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... }

Page 36: Reduce to the Max: Lightweight Java EE

Refactoring - Step 1 JSF & CDI Lightway Java EE

@javax.inject.Named(“userController“) @javax.enterprise.context.SessionScoped public class UserControllerMB implements Serializable {

private User user; // plus getter and setter

@javax.inject.Inject private authControllerMB AuthenticationController;

@javax.inject.Inject private UserService userService

@javax.inject.Inject private MailService mailService

... }

Page 37: Reduce to the Max: Lightweight Java EE

Refactoring - Step 1 JSF & CDI Lightway Java EE

@SessionScopedclass MyBeanA

Proxy forclass MyModel

@Inject

@RequestScopedclass MyModel

Injection Target Contextual Reference Contextual Instance

businessMethod() Lookup or create

return

businessMethod()

returnreturn

Spezialfall

Page 38: Reduce to the Max: Lightweight Java EE

Java

„Use Business Injection instead of

Infrastructure Injection.“

RefactoringStep 2

Page 39: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserControllerMB implements Serializable {

@Inject private AuthControllerMB authenticationController;

@EJB private UserService userService

@EJB private MailService mailService

... }

Page 40: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserControllerMB implements Serializable {

@Inject private SystemUser loggedInUser;

@EJB private UserService userService

@EJB private MailService mailService

... }

Page 41: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserControllerMB implements Serializable {

@Inject private SystemUser loggedInUser;

@EJB private UserService userService

@EJB private MailService mailService

... }

@Current

Page 42: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@SessionScoped public class AuthenticationController

implements Serializable {

private SystemUser authenticatedUser;

public String authenticate() { ... }

public SystemUser getAuthenticatedUser() { return authenticatedUser; }

}

Page 43: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@SessionScoped public class AuthenticationController

implements Serializable {

private SystemUser authenticatedUser;

public String authenticate() { ... }

public SystemUser getAuthenticatedUser() { return authenticatedUser; }

}

@Produces @Current

Page 44: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@SessionScoped public class AuthenticationController

implements Serializable {

private SystemUser authenticatedUser;

public String authenticate() { ... }

public SystemUser getAuthenticatedUser() { return authenticatedUser; }

}

@Produces @Current

@Inject @Current SystemUser

Page 45: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@SessionScoped public class AuthenticationController

implements Serializable {

private SystemUser authenticatedUser;

public String authenticate() { ... }

public SystemUser getAuthenticatedUser() { return authenticatedUser; }

}

@Produces @Current

@Inject @Current SystemUser

@Named(“loggedInUser“)

#{loggedInUser}

Page 46: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@SessionScoped public class AuthenticationController

implements Serializable {

private SystemUser authenticatedUser;

public String authenticate() { ... }

public SystemUser getAuthenticatedUser() { return authenticatedUser; }

}

@Produces @Current

@Inject @Current SystemUser

@Named(“loggedInUser“)

#{loggedInUser}

@RequestScoped

Page 47: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@Qualifier@Target({FIELD, PARAMETER, METHOD, TYPE})@Retention(RUNTIME)public @interface Current { }

Page 48: Reduce to the Max: Lightweight Java EE

Refactoring - Step 2 JSF & CDI Lightway Java EE

@Qualifier@Target({FIELD, PARAMETER, METHOD, TYPE})@Retention(RUNTIME)public @interface Current { }

Self-made Qualifier

Page 49: Reduce to the Max: Lightweight Java EE

Java

„Split Monster Use Case into its

logical & modular Parts.“

RefactoringStep 3

Page 50: Reduce to the Max: Lightweight Java EE

Refactoring - Step 3 JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserControllerMB implements Serializable {

...

public String create() { if (user.getUsername() == user.getPassword()) { ... // create faces messages return USERNAME_SHOULD_NOT_EQUAL_PASSSWORD; // createUser.xhtml } else if (userService.checkForFreeUsername(user.getUsername())) { userService.create(user); mailService.sendWelcomeMail(user); User loggedInUser = authenticationController.getLoggedInUser(); if (Role.ROLE_TRAINEE.equals(loggedInUser.getRole()) { trackingService.trackAction(TrackAction.USER_CREATED, user); } return “USER_CREATED“; // or userOverview.xhtml } else { ... // create faces messages return “DUPLICATE_USERNAME“; // or createUser.xhtml } } }

Page 51: Reduce to the Max: Lightweight Java EE

Refactoring - Step 3 JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserControllerMB implements Serializable {

...

public String create() { if (user.getUsername() == user.getPassword()) { ... // create faces messages return USERNAME_SHOULD_NOT_EQUAL_PASSSWORD; // createUser.xhtml } else if (userService.checkForFreeUsername(user.getUsername())) { userService.create(user); mailService.sendWelcomeMail(user); User loggedInUser = authenticationController.getLoggedInUser(); if (Role.ROLE_TRAINEE.equals(loggedInUser.getRole()) { trackingService.trackAction(TrackAction.USER_CREATED, user); } return “USER_CREATED“; // or userOverview.xhtml } else { ... // create faces messages return “DUPLICATE_USERNAME“; // or createUser.xhtml } } }

Page 52: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserController implements Serializable {

...

private User user; ... public String create() { userService.create(user); // main use case ... return “USER_CREATED“; // navigation } }

Refactoring - Step 3

Page 53: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserController implements Serializable {

@Inject @Created Event<User> userCreatedEventSource;

private User user; ... public String create() { userService.create(user); // main use case userCreatedEventSource.fire(user); // sub use cases return “USER_CREATED“; // navigation } }

Refactoring - Step 3

Page 54: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserController implements Serializable {

@Inject @Created Event<User> userCreatedEventSource;

private User user; ... public String create() { userService.create(user); // main use case userCreatedEventSource.fire(user); // sub use cases return “USER_CREATED“; // navigation } }

Refactoring - Step 3 Loosly coupled

via CDI Event

Page 55: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@ApplicationScoped public class MailService {

public void sendWelcomeMail(@Observes @Created User createdUser) {

... // do some work with createdUser }

... }

Refactoring - Step 3

Event Consumer I

Page 56: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@ApplicationScoped public class TrackingService {

@Inject @Current User loggedInUser;

public void trackUserCreated(@Observes @Created User newUser) { if (User.ROLE_TRAINEE.equals(loggedInUser.getRole()) { this.trackAction(TrackAction.USER_CREATED, newUser); } } ... }

Refactoring - Step 3

Event Consumer II

Page 57: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@ApplicationScoped public class TrackingService {

@Inject @Current User loggedInUser;

public void trackUserCreated(@Observes(during == AFTER_SUCCESS) @Created User newUser) { if (User.ROLE_TRAINEE.equals(loggedInUser.getRole()) { this.trackAction(TrackAction.USER_CREATED, newUser); } } ... }

Refactoring - Step 3

Event Consumer II

Page 58: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@ApplicationScoped public class GlobalCache {

public void insertIntoCache(@Observes(receice == IF_EXISTS, during == AFTER_SUCCESS) @Created User newUser) { ... // do some work } ... public void deleteFromCache(@Observes(receice == IF_EXISTS, during == AFTER_SUCCESS) @Deleted User deletedUser) { ... // do some other work }

}

Refactoring - Step 3

Event Consumer II

Page 59: Reduce to the Max: Lightweight Java EE

Java

„Validate once and only once -

not once per layer.“

RefactoringStep 4

Page 60: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

Page 61: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

Page 62: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

*many thanks to irian.at

Page 63: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

*many thanks to irian.at

Page 64: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

<html  xmlns=“http://www.w3.org/1999/xhtml”      ...

     <h:form  id=“createUserForm”>            <h:outputLabel  for=“firstName“  value=“Vorname:“            <h:inputText  id=“firstName“                                        value=“#{userController.user.firstName}“>                  <f:validateRequired  />                  <f:validateLenght  minimum=“8“  />              </h:inputText>            ...                </h:form>      ...

     <h:messages  globalOnly=“true”  /></html>

Page 65: Reduce to the Max: Lightweight Java EE

JSF & CDI

Und wo ist das Problem?

‣Cross Side Validation‣Cross Layer Validation‣Cross Component Validation

Migration GuideRefactoring - Step 4

Page 66: Reduce to the Max: Lightweight Java EE

JSF & CDI

Cross Side/Layer Validation

‣ Bean Validation 1.0 (JSR 303)‣ @nnotation basiert

‣ Validierung des Domain Models‣ JSF 2 supported‣ eigene Constraints möglich

Migration GuideRefactoring - Step 4

Page 67: Reduce to the Max: Lightweight Java EE

JSF & CDI Migration Guide

Refactoring - Step 4

public  class  User  {

   @Birthday    private  Date  dateOfBirth;      @Min(value  =  0)    private  Integer  children;

   @NotNull    private  String  firstName;          @NotNull    private  String  lastName;  

   ...}

Validator Interface

Page 68: Reduce to the Max: Lightweight Java EE

JSF & CDI

Cross Component Validation

‣ JSF Events ermöglichen das gezielte Aufrufen einer via <f:event> Tag angegebenen Methode als direkte Reaktion auf ein Component Event

‣ JSF Events sind u.a. ‣ preValidate‣ postValidate

Migration GuideRefactoring - Step 4

Page 69: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

<html  xmlns=“http://www.w3.org/1999/xhtml”      ...

     <h:form  id=“changePassword”>

           <f:event  type=“postValidate”                              listener=“changePasswordBean.validate”  />            ...                </h:form>      ...

     <h:messages  globalOnly=“true”  /></html>

Page 70: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

Refactoring - Step 4

public  class  ChangePasswordBean  {      ...

   public  void  validate(ComonentSystemEvent  event)  {        UIForm  form  =  (UIForm)e.getComponent();          UIInput  oldPwdInput  =  (UIInput)form.findComponent(“oldPwd”);        String  oldPwd  =  (String)oldPwdInput.value();          ...                if  (oldPwd.equals(newPwd))  {              //  1.  set  faces  error  messgage              //  2.  render  response              ...        }    }}

Page 71: Reduce to the Max: Lightweight Java EE

Java

„Make Transactions where you want - not

where Technology.“

RefactoringStep 5

Page 72: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

TX

Refactoring - Step 5

Page 73: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

TX

Refactoring - Step 5

Page 74: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserController implements Serializable {

...

public String create() { userService.create(user); // main use case userCreatedEventSource.fire(user); // Created Event return “USER_CREATED“; // Navigation } }

Refactoring - Step 5

Page 75: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserController implements Serializable {

...

public String create() { userService.create(user); // main use case userCreatedEventSource.fire(user); // Created Event return “USER_CREATED“; // Navigation } }

Refactoring - Step 5

Transactional Use Case

Page 76: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserController implements Serializable {

...

public String create() { userService.create(user); // main use case userCreatedEventSource.fire(user); // Created Event return “USER_CREATED“; // Navigation } }

Refactoring - Step 5

Transactional Use Case

* JTA 1.2 oder DeltaSpike oder Self-Made

@Transactional

Page 77: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface Transactional { @NonBinding public TransactionalType value() ! default TransactionalType.REQUIRED; }

Refactoring - Step 5

Page 78: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface Transactional { @NonBinding public TransactionalType value() ! default TransactionalType.REQUIRED; }

Refactoring - Step 5

Transactional Annotation

Page 79: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Transactional @Interceptor public class TransactionInterceptor {

@Inject private UserTransaction utx;

@AroundInvoke public Object applyTransaction(InvocationContext ic) throws Throwable {

... // implement utx.begin() ic.proceed(); // call original method ... // implement utx.commit()

} }

Refactoring - Step 5

* XML Konfiguration

Page 80: Reduce to the Max: Lightweight Java EE

JSF & CDI Lightway Java EE

@Transactional @Interceptor public class TransactionInterceptor {

@Inject private UserTransaction utx;

@AroundInvoke public Object applyTransaction(InvocationContext ic) throws Throwable {

... // implement utx.begin() ic.proceed(); // call original method ... // implement utx.commit()

} }

Refactoring - Step 5

* XML Konfiguration

Transactional Interceptor

Page 81: Reduce to the Max: Lightweight Java EE

Java

„Use corresponding Scopes - not too short

and not too long“

RefactoringStep 6

Page 82: Reduce to the Max: Lightweight Java EE

Refactoring - Step 6 JSF & CDI Lightway Java EE

@Named(“userController“) @SessionScoped public class UserControllerMB implements Serializable {

private User user;

... public String askForDeleteConfirmation(User userToDelete) { user = userToDelete; return “USER_READY_FOR_DELETE“; // userDeleteConfirmation.xhtml }

public String deleteAfterConfirmation() { userService.delete(user); ... // do some more stuff, e.g. sending an email, tracking, ... user = null; return “USER_DELETED“; // userSuccessfulDeleted.xhtml }

}

Page 83: Reduce to the Max: Lightweight Java EE

Refactoring - Step 6 JSF & CDI Lightway Java EE

@RequestScopedclass MyBeanA

@ConversationSopedclass MyWizard

@Inject Conversation conv; // inside „start“ Methode conv.begin();

// inside „end“ Methode conv.end();

@RequestScopedclass MyBeanB

@Inject

@Inject

Page 84: Reduce to the Max: Lightweight Java EE

Refactoring - Step 6 JSF & CDI Lightway Java EE

@Named(“userController“) @ConversationScoped public class UserControllerMB implements Serializable {

private User user;

@Inject Conversation conversation; ... public String askForDeleteConfirmation(User userToDelete) { conversation.begin(); user = userToDelete; return “USER_READY_FOR_DELETE“; // userDeleteConfirmation.xhtml }

public String deleteAfterConfirmation() { ... }

}

Page 85: Reduce to the Max: Lightweight Java EE

Refactoring - Step 6 JSF & CDI Lightway Java EE

@Named(“userController“) @ConversationScoped public class UserControllerMB implements Serializable{

private User user;

@Inject Conversation conversation; ... public String askForDeleteConfirmation(User userToDelete) { ... }

public String deleteAfterConfirmation() { conversation.end(); userService.delete(user); ... // do some more stuff, e.g. sending an email, tracking, ... user = null; return “USER_DELETED“; // or userSuccessfulDeleted.xhtml }

}

Page 86: Reduce to the Max: Lightweight Java EE

Java

„The Spec is kind of slow when it

comes to evolution.“

The MissingPieces

Page 87: Reduce to the Max: Lightweight Java EE

EE Web Profile - Missing PiecesJSF & CDI Lightway Java EE

Bessere Conversationen

Built-in Transaktionen

weitere Scopes

typesafe Navigation

und vieles mehr ...

Page 88: Reduce to the Max: Lightweight Java EE

EE Web Profile - Missing PiecesJSF & CDI Lightway Java EE

Page 89: Reduce to the Max: Lightweight Java EE

JSF & CDI

Lightway Enterprise Java

‣mit CDI

‣ typensicher ‣ schichtenneutral‣ fachliche und technologische Injection ‣ eventgetriebene Entwicklung

FazitMigration Guide

Page 90: Reduce to the Max: Lightweight Java EE

Java

Reduce to the MaxLightway Enterprise Java

Lars Röwekamp | open knowledge GmbH

@mobileLarson@_openknowledge