I was working on a RESTful service with JAX RS on Glassfish and pieced together a working implementation with CDI dependency injection.
This REST service is pretty simple, when you access /test/hello?name=John with a GET, you will get “Hello world John” back. Note the @ManagedBean annotation – this will make CDI dependency injection working in a JAX RS instantiated service.
The HelloRepository is injected with CDI:
You can package this as a WAR file and deploy it on a Glassfish server. To make this work, you need a minimal web.xml in WEB-INF:
To enable CDI, you need an empty beans.xml in WEB-INF:
And to make JAX RS working correctly and set the root path, you need this class:
To set the context root, you could also add a glassfish-web.xml in WEB-INF – this is of course Glassfish specific.
After figuring this out, it is easy to configure and doesn’t need any complicated XML. I got the above configuration working on Glassfish 3 and 4.
The purpose of Docker is to package everything into a container so that you can run your application anywhere in a consistent state. To achieve this with a web application and Glassfish, you package the Java virtual machine (JDK 8), Glassfish 4.1 and your web application together.
I created an example of using my base Glassfish image with the Primefaces showcase war file:
MAINTAINER Koert Zeilstra <firstname.lastname@example.org>
RUN wget http://repository.primefaces.org/org/primefaces/showcase/5.2/showcase-5.2.war -O /opt/app/deploy/showcase.war
This will download the war file and put it into the /opt/app/deploy directory – the startup script will copy this file into the Glassfish autodeploy directory. When Glassfish starts up, it will automatically deploy the war and you can access the applciation after starting with:
docker run -d -p 8080:8080 koert/glassfish-showcase
On my laptop it starts up in about 12 seconds, you can look at the application in your browser: http://localhost:8080/showcase