Scala and Java EE 7 Development
Experiences
Peter A. Pilgrim
Independent Contractor, Java Champion
Biography
■  Completed Java Sybase
course in 1998
■  Founded JAVAWUG
2004-2010
■  Independent Contractor
■  Blue-chip busi...
September 2013
Java EE 7
Developer
Handbook
•  Overview of Scala
•  Java EE 7 architecture and design
•  Using Gradle as a build tool
•  How to create beans in Scala ...
“The right architecture to the right application. Not all of us work
for Facebook or Twitter. If you look at their "web si...
Scalable Language
12/05/2014 XeNoNiQUe.co.uk (c) 2011 7
Still has a very bright future
Purely Object-Oriented
Statically-t...
Typing Derived from “Pascal” Tree of
Computer Language
<variableName> [: [ <Type> ]
personName: String
taxRate: Float
dens...
Variables and Values
Assignment less programming
Prefer val over var

var x = 10.0; x = 10 + x
val y = 10.0
val z: Float =...
Scala Class
class Person (

val firstName: String

val lastName: String,

val height: Float,

val age: Int ) { 

// Write ...
Instances of Scala Classes

val p1 = new Person( "Billy",
"Mitchell", 5.10F, 42 )

val p2 = new Person( "Kat",
"Moon", 5.8...
Companion Objects
object Person {
private records = List[Person]()
def apply(fn: String, ln: String,
h: Float, a: Int): Pe...
Case Classes

class Transmission( driveTrain:
String )
May 12, 2014 Xenonique ©2013 13
Scala Functions

val isEven: (Int => Boolean) = (k: Int) => k % 2 == 0



•  Functions are values, values are object
•  Er...
Scala Code
def uniqueSorted[Symbol]( p: List[Symbol] ): List[Symbol] = {
val myOrdering = 
Ordering.fromLessThan[Symbol]( ...
Functions are First Class
•  In Scala, functions are first class citizens
•  Functions can return functions
May 12, 2014 X...
SBT
•  SBT is the de-facto build tool
•  Works with Maven
•  Incremental Compilation +1
•  DSL written in Scala +1
•  Plug...
Gradle
•  Gradle is written in Groovy
•  Gradle is a DSL too +1
•  Easier to Grok +1
•  Since v1.4 Gradle support incremen...
ENTERPRISE
DEVELOPMENT
Modern Practice
Java EE 7 Framework Updates
Interface Boundary
Endpoints
JAX RS 2.0
JMS 2.0
Bean Validation 1.1
Management and
Storage
EJB...
CDI and Scala
trait Processor { 

def process( payload: DataValue ) : Unit

/* ... */ 
}

@ApplicationScoped
class Datasta...
What about Java SE 8?
public interface PaymentIssuer {

public void allocate( int id );
}
What about Java SE 8?
@ApplicationScoped
public class CreditCardTicketTracker() {

@Inject PaymentIssuer issuer;



public...
What about Java SE 8?

public void doWork( List<Ticket> ticketBatch ) {

 
 DateTime dt = new DateTime().minusDays(2);

 
...
Write Annotations as Java
// In the Java source tree (src/main/java)
import javax.inject.Qualifier;
import javax.intercept...
Stock CDI Advice
•  CDI does works very well with Scala POJOs
•  CDI cannot instantiate companion objects!
•  CDI beans mu...
CDI Setter Injection
•  Take advantage of Scala’s @BeanProperty
annotation
@BeanProperty
var liveStatus:String = “Default”...
CDI Scopes
// Prefer CDI scopes if you use JSF in Java EE
import javax.enterprise.context.RequestScoped
import javax.enter...
Last Advice on CDI Proxies
•  Scala POJOs need a lifecycle scope
•  Always create default no args constructor
•  Cannot be...
JSF Managed Beans
import javax.enterprise.context.RequestScoped
import javax.inject.Named

@Named @RequestScoped
class Bas...
JSF XHTML Facelet View
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html ...>
<html xmlns="http://www.w3.org/1999/xhtm...
JSF XHTML Facelet View
<h:body> ...
<h:form>
<h:commandButton 
action="#{basicFlow.serveResponse}”
value="Invoke Action" /...
Demo CDI and Scala
Produces JMS Connections in Scala
class JMSResourceProducer { 
@Resource(name = "jms/OrderConnectionFactory")
private orde...
Scala and JAX-RS
•  JAX-RS 2 annotations work with Scala
POJOS out of the box
•  Annotate on public methods
•  @GET, @POST...
Use Qualifiers in Scala
// In the Scala source tree (src/main/scala)
@ApplicationScoped
@PermanentStorage
class DatastarPr...
JAX-RS
@Path("/alldata")
class AllDataServiceEndpoint {
@Inject var fastService: FastService = _
@Inject var predictorServ...
JAX-RS
def listServices = {
val listServices = 

(fastService.configuredAllServices ++ 

 
predictorService.configuredAllS...
Jackson, Scala & JSON Support
•  JAX-RS works well with Scala POJOs
•  JAX-RS and Java EE 7 provides JSON
providers only f...
Jackson Scala JAX-RS
@Singleton
@Provider
@Consumes(

Array(MediaType.APPLICATION_JSON, 

"application/*+json", "text/json...
Jackson Scala JAX-RS
object JacksonScalaContextResolver {
def getObjectMapper: ObjectMapper = {
val mapper = new ObjectMap...
Open Source Integration Testing
Peter Muir, David Blewin and Aslak Knutsen and from Red Hat JBoss.
Demo Alternative
Demo Servlets, CDI & EJB
Java EE 7 Demo
EXECUTIVE SUMMARY
Digital by Default with Java
“If you're frustrated that you're not getting picked, one
plan is to up your game, to hustle harder, ... But in the
era of...
Run It Yourself
•  https://github.com/peterpilgrim/javacro
•  Download the source code, build and run
•  Feedback, welcome...
Thank You!
The book:
http://www.packtpub.com/java-ee-7-
developer-handbook/book
Blog:
http://xenonique.co.uk/blog/
Twitter...
Creative Commons Attributions
http://www.flickr.com/photos/holstphoto/3371060720/
Photo of "Chip Pattern" by Ryan Holst, M...
Creative Commons Attributions
http://www.flickr.com/photos/josefstuefer/43867840/
Proof of Pattern messh "untitled" in tan...
JavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development Experiences
Upcoming SlideShare
Loading in …5
×

JavaCro 2014 Scala and Java EE 7 Development Experiences

1,870 views

Published on

Scala is an alternative JVM language with both object-oriented and functional programming paradigms. Scala development with the Java EE 7 platform is definitely possible and can be a pleasant experience. If you have uncertainty about how Scala can fit around the Java EE 7 platform, then this session aims to illustrate the huge benefit that Scala adoption can bring to the platform. Many other developers are taking advantage and the challenge of the JVM’s capability of being a vessel for multi-language programming. You no longer have to write every single project using Java, even if you like Lambdas experiences.

For the developer and engineering terms that feeling a little braver than usual, Scala is attractive as it is strongly typed and lets you set the gauge on how object oriented or how functional you want to be. You will learn how to reuse the annotations and creating Scala plain object safely and concisely.

This session will highlight and contrast the experience I had developing Scala solutions with Java EE, and there will be plenty of advice about using the functional programming features against the Java object oriented API.

Scala language overview
Java EE 7 architecture and design
Using Gradle as a build tool
How to create beans in Scala with dependency injection
JAX-RS endpoints
Servlet Endpoints
JMS Messaging
Scala adoption advice and hints for sustainable team development

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

No Downloads
Views
Total views
1,870
On SlideShare
0
From Embeds
0
Number of Embeds
824
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

JavaCro 2014 Scala and Java EE 7 Development Experiences

  1. 1. Scala and Java EE 7 Development Experiences Peter A. Pilgrim Independent Contractor, Java Champion
  2. 2. Biography ■  Completed Java Sybase course in 1998 ■  Founded JAVAWUG 2004-2010 ■  Independent Contractor ■  Blue-chip business: Digitas Lbi, Barclays Retail, Transform
  3. 3. September 2013 Java EE 7 Developer Handbook
  4. 4. •  Overview of Scala •  Java EE 7 architecture and design •  Using Gradle as a build tool •  How to create beans in Scala with dependency injection •  JAX-RS endpoints •  Servlet Endpoints •  JMS Messaging •  Scala adoption advice and hints for sustainable team development
  5. 5. “The right architecture to the right application. Not all of us work for Facebook or Twitter. If you look at their "web site" the navigation is quite simple… For them, statelessness and NoSQL is mandatory. But when you work on a "web application” then you deal with complex flow management. Their problem is elsewhere : fewer users but complex long time running transactional flows. Stateful architecture are mandatory. Antonio Gonclaves Why Java EE Lost and Spring Won http://java.dzone.com/articles/why-java-ee-lost-and-spring
  6. 6. Scalable Language 12/05/2014 XeNoNiQUe.co.uk (c) 2011 7 Still has a very bright future Purely Object-Oriented Statically-typed Functional JVM Language
  7. 7. Typing Derived from “Pascal” Tree of Computer Language <variableName> [: [ <Type> ] personName: String taxRate: Float density: Double found: False persion: Person May 12, 2014 Xenonique ©2013 8
  8. 8. Variables and Values Assignment less programming Prefer val over var var x = 10.0; x = 10 + x val y = 10.0 val z: Float = x var t: Int = 42; t = t * 2 9
  9. 9. Scala Class class Person ( val firstName: String val lastName: String, val height: Float, val age: Int ) { // Write your definition here } May 12, 2014 Xenonique ©2013 10
  10. 10. Instances of Scala Classes val p1 = new Person( "Billy", "Mitchell", 5.10F, 42 ) val p2 = new Person( "Kat", "Moon", 5.8F, 39 ) May 12, 2014 Xenonique ©2013 11
  11. 11. Companion Objects object Person { private records = List[Person]() def apply(fn: String, ln: String, h: Float, a: Int): Person = { val p = new Person(fn, ln, h, a ); records = p :: records.reverse // O(1) return p } def recordCount() = records.size } May 12, 2014 Xenonique ©2013 12
  12. 12. Case Classes class Transmission( driveTrain: String ) May 12, 2014 Xenonique ©2013 13
  13. 13. Scala Functions val isEven: (Int => Boolean) = (k: Int) => k % 2 == 0 •  Functions are values, values are object •  Ergo, functions are objects in Scala May 12, 2014 Xenonique ©2013 14
  14. 14. Scala Code def uniqueSorted[Symbol]( p: List[Symbol] ): List[Symbol] = { val myOrdering = Ordering.fromLessThan[Symbol]( _.toString < _.toString ) var acc = SortedSet.empty(myOrdering) def compress0( q: List[Symbol] ): Unit = { q match { case Nil => Nil case x :: xs => { acc += x ; compress0(xs) } } } May 12, 2014 Xenonique ©2013 15
  15. 15. Functions are First Class •  In Scala, functions are first class citizens •  Functions can return functions May 12, 2014 Xenonique ©2013 16
  16. 16. SBT •  SBT is the de-facto build tool •  Works with Maven •  Incremental Compilation +1 •  DSL written in Scala +1 •  Plugins Available +1 •  Complex to Understand -1 May 12, 2014 Xenonique ©2013 17
  17. 17. Gradle •  Gradle is written in Groovy •  Gradle is a DSL too +1 •  Easier to Grok +1 •  Since v1.4 Gradle support incremental compilation through Zinc •  Not the de-facto standard -1 May 12, 2014 Xenonique ©2013 18
  18. 18. ENTERPRISE DEVELOPMENT Modern Practice
  19. 19. Java EE 7 Framework Updates Interface Boundary Endpoints JAX RS 2.0 JMS 2.0 Bean Validation 1.1 Management and Storage EJB 3.2 CDI 1.1 JPA 2.1 Web and HTML Service Endpoints Servlet 3.1 WebSocket 1.0 JSF 2.2 JSON 1.0
  20. 20. CDI and Scala trait Processor { def process( payload: DataValue ) : Unit /* ... */ } @ApplicationScoped class DatastarProcessor extends Processor { @Inject var dataStore: DataStore = _ override def process( payload: DataValue): Unit = { // Do something here } }
  21. 21. What about Java SE 8? public interface PaymentIssuer { public void allocate( int id ); }
  22. 22. What about Java SE 8? @ApplicationScoped public class CreditCardTicketTracker() { @Inject PaymentIssuer issuer; public void doWork( List<Ticket> ticketBatch ) { } }
  23. 23. What about Java SE 8? public void doWork( List<Ticket> ticketBatch ) { DateTime dt = new DateTime().minusDays(2); ticketBatch.stream() .filter( t -> t.isAvailable() && t -> t.paymentType == PaymentType.CreditCard && t.concertDate.before( dt ) ) .map( t -> p.getAllocationId() ) .forEach( allocationId -> issuer.allocate(allocationId)); }
  24. 24. Write Annotations as Java // In the Java source tree (src/main/java) import javax.inject.Qualifier; import javax.interceptor.InterceptorBinding; import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; @Qualifier @InterceptorBinding @Target({METHOD, TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface PermanentStorage { } public @interface CachedStorage { } public @interface TransientStorage { }
  25. 25. Stock CDI Advice •  CDI does works very well with Scala POJOs •  CDI cannot instantiate companion objects! •  CDI beans must have a default constructor •  CDI does not understand case classes (but see later …)
  26. 26. CDI Setter Injection •  Take advantage of Scala’s @BeanProperty annotation @BeanProperty var liveStatus:String = “Default” @Inject def setLiveStatus(a:String):Unit=???
  27. 27. CDI Scopes // Prefer CDI scopes if you use JSF in Java EE import javax.enterprise.context.RequestScoped import javax.enterprise.context.SessionScoped import javax.enterprise.context.ApplicationScoped // Instead of import javax.faces.bean.RequestScoped import javax.faces.bean.SessionScoped import javax.faces.bean.ApplicationScoped
  28. 28. Last Advice on CDI Proxies •  Scala POJOs need a lifecycle scope •  Always create default no args constructor •  Cannot be final or have final members – (Interaction between Java and Scala)
  29. 29. JSF Managed Beans import javax.enterprise.context.RequestScoped import javax.inject.Named @Named @RequestScoped class BasicFlow { def serveResponse() = "endState.xml" }
  30. 30. JSF XHTML Facelet View <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html ...> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core”> <h:head> ... </h:head> <h:body> ... </h:body> </html>
  31. 31. JSF XHTML Facelet View <h:body> ... <h:form> <h:commandButton action="#{basicFlow.serveResponse}” value="Invoke Action" /> </h:form> </h:body>
  32. 32. Demo CDI and Scala
  33. 33. Produces JMS Connections in Scala class JMSResourceProducer { @Resource(name = "jms/OrderConnectionFactory") private orderConnectionFactory: QueueConnectionFactory = _ @Produces @Order @Resource(name = "jms/OrderQueue") private orderQueue: Queue = _ @Produces @Order def createOrderConnection(): QueueConnection = orderConnectionFactory.createQueueConnection() @Produces @Order def createOrderSession(@Order conn:QueueConnection): QueueSession = conn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE) }
  34. 34. Scala and JAX-RS •  JAX-RS 2 annotations work with Scala POJOS out of the box •  Annotate on public methods •  @GET, @POST, @PUT, @DELETE •  @Produces, @Consumes
  35. 35. Use Qualifiers in Scala // In the Scala source tree (src/main/scala) @ApplicationScoped @PermanentStorage class DatastarProcessor extends Processor { @Inject var dataStore: DataStore = _ override def process( payload: DataValue): Unit = { /* ... */ } }
  36. 36. JAX-RS @Path("/alldata") class AllDataServiceEndpoint { @Inject var fastService: FastService = _ @Inject var predictorService: PredictorService = _ @Context var request: HttpServletRequest = _ @Path("/item") @GET @Produces(Array(APPLICATION_JSON)) def listServices = ??? }
  37. 37. JAX-RS def listServices = { val listServices = (fastService.configuredAllServices ++ predictorService.configuredAllServices) map { makeElement( _ ) } Response.ok(listServices, MediaType.APPLICATION_JSON).build } }
  38. 38. Jackson, Scala & JSON Support •  JAX-RS works well with Scala POJOs •  JAX-RS and Java EE 7 provides JSON providers only for Java POJOs •  Use Jackson JSON Providers for seamless support of case classes
  39. 39. Jackson Scala JAX-RS @Singleton @Provider @Consumes( Array(MediaType.APPLICATION_JSON, "application/*+json", "text/json")) @Produces( Array(MediaType.APPLICATION_JSON, "application/*+json", "text/json")) class JacksonScalaContextResolver extends JacksonJaxbJsonProvider( JacksonScalaContextResolver.getObjectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS)
  40. 40. Jackson Scala JAX-RS object JacksonScalaContextResolver { def getObjectMapper: ObjectMapper = { val mapper = new ObjectMapper with ScalaObjectMapper mapper.registerModule(new DefaultScalaModule) mapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) mapper.setSerializationInclusion(Include.NON_NULL); mapper } }
  41. 41. Open Source Integration Testing Peter Muir, David Blewin and Aslak Knutsen and from Red Hat JBoss.
  42. 42. Demo Alternative
  43. 43. Demo Servlets, CDI & EJB
  44. 44. Java EE 7 Demo
  45. 45. EXECUTIVE SUMMARY Digital by Default with Java
  46. 46. “If you're frustrated that you're not getting picked, one plan is to up your game, to hustle harder, ... But in the era of picking yourself, it seems to me that you're better off finding a path that doesn't require you get picked in order to succeed.” Seth Godin, Getting Picked (‘need to’ versus ‘want to’)
  47. 47. Run It Yourself •  https://github.com/peterpilgrim/javacro •  Download the source code, build and run •  Feedback, welcomed!
  48. 48. Thank You! The book: http://www.packtpub.com/java-ee-7- developer-handbook/book Blog: http://xenonique.co.uk/blog/ Twitter: @peter_pilgrim
  49. 49. Creative Commons Attributions http://www.flickr.com/photos/holstphoto/3371060720/ Photo of "Chip Pattern" by Ryan Holst, March, 2009 http://www.flickr.com/photos/scarygami/5489773527/lightbox/ Photo of "Pattern" by Scarygami http://www.flickr.com/photos/christianhaugen/3486381680/sizes/l/in/photostream/ Photo of "Patterns in the Sand" by Christian Haugen http://www.flickr.com/photos/krunkwerke/3840127296/ Photo of a series of punch cards which are strung together, to control the pattern woven by the Jacquard loom. John R. Southern
  50. 50. Creative Commons Attributions http://www.flickr.com/photos/josefstuefer/43867840/ Proof of Pattern messh "untitled" in tan by Josef Stuefer http://www.flickr.com/photos/josefstuefer/43972554/ Proof of Pattern mesh "untitled" in blue by Josef Stuefer http://www.flickr.com/photos/scott1723/6290151038/ Alter photo of "Tug of War 3" by Scott Anderson

×