Oracle Blog

EARTHLY Powers

Wednesday Mar 23, 2011

As you know from the last post by Paul, he left Oracle about a month ago and as a result of that lost write access to blogs.sun.com, so had to move his blog to a different location. I'd like to let you know we are going to keep this blog around as a valuable part of "internet memory" and an archive of lots of useful info.

I'd also like to use this opportunity to share a little more about the Jersey team and our future plans, since I've been receiving some questions around this recently.

Jakub Podlesak, who worked closely with Paul and Marc from the very beginning of Project Jersey, took over Paul's role of the Jersey technical lead. Next week we are planning to release Jersey 1.6 and we are resuming the 6-8 weeks release cycles (which we kind of stopped doing as we were finalizing delivery for GlassFish 3.1). Together with Pavel Bucek - another senior member of our team - they are doing their best to make sure you continue loving Jersey :), and Jon Benoit - our QA engineer is making sure whatever features we put in are well tested.

Marek Potociar, former lead of Project WSIT, took over the Jersey 2.0 prototyping work from Paul and is now working closely with Roberto Chinnici on co-driving JAX-RS 2.0. You will start seeing him more often once we push the 2.0 prototyping work to the open workspace.

Here are the team's blogs you may want to bookmark to be able to track the future progress of Jersey more closely:

Thursday Jan 27, 2011

We have recently released version 1.5 of Jersey, the open source,
production quality, reference implementation of JAX-RS. The JAX-RS 1.1 specification
is available at the JCP web site and also available in non-normative
HTML here.

In the interval between releasing Jersey 1.4 and Jersey 1.5 both the JSR 311 project and the Jersey project transitioned to the new java.net infrastructure. There are probably a few links here and there that still need updating. One noticeable improvement is the visibility of the project to search engines now that HTTPS is not the default. That means it is much easier to search for stuff in the User guide and JavaDoc. The project name is starting to compete in search ranking with the island and comes out favorably when searching for JAX-RS.

This release contains mostly bug fixes rather than features. This version, failing any showstoppers, will be shipped with GlassFish 3.1.

Friday Oct 15, 2010

[This is a rather tardy announcement of the Jersey 1.4 release which occurred just before the week of JavaOne a week of vacation to decompress.]

We have recently released version 1.4 of Jersey, the open source,
production quality, reference implementation of JAX-RS. The JAX-RS 1.1 specification
is available at the JCP web site and also available in non-normative
HTML here.

Pavel integrated JRebel support with Jersey, see here. So now it is possible to modify code, compile and JRebel will inform Jersey to reload information. Jersey needs to reload because it caches information about classes, using reflection, at runtime.

Martin and Jon improved the look and feel of the JavaDoc and user guide, added a search bar on the main page, and improved the way Google indexes the Jersey site, user guide and JavaDoc. For example if one searches for Viewable information about Jersey's Model View Controller support is displayed (note that documentation still needs to be added for this).

Jackson was upgraded to version 1.5.5 (this project releases fast!). And Jakub added simplified configuration support for Jackson so it is not necessary to explicitly register the Jackson JAX-RS providers. See here.

The jersey-core module now bundles the classes from the jsr-311.jar so it is no longer necessary to include the latter jar in your class path. This was required so we can correctly isolate OSGi bundles using different versions of Jersey.

Roberto added support for improved CDI integration such that parameters of constructors of CDI constructed or managed beans may be injected with JAX-RS artifacts. This requires some fairly funky adaption of the CDI bean module in a CDI extension and pushes CDI and Weld to the limits. Unfortunately because of this it has introduced a regression with with GlassFish 3.1 and the current version of Weld. We tried to work around the issue but alas it sometimes fails with an NPE. However, the good news is i managed to create an alternative work around, which looks promising (thanks John Lister for verifying and providing addition feedback/patches!). The new workaround should be available in an early access release of 1.5 next week.

Martin is my manager but Martin codes :-) he added an API and SPI to make it easy to build OAuth 1.0 service providers. The default in-memory implementation of the SPI can be used for samples and tests and to guide people on how they can develop a more advanced implementation that persists credential information. See more here.

Friday Jul 02, 2010

We have recently released version 1.3 of Jersey, the open source,
production quality, reference implementation of JAX-RS. The JAX-RS 1.1 specification
is available at the JCP web site and also available in non-normative
HTML here.

Usually this version would also be placed on the GlassFish Update Center and integrated into the GlassFish M2 release but we hit some last minute glitches with our GlassFish OSGi integration that broke the RESTful admin service. So we are working on fixing that for the next release.

This release only works with Java SE 6 or greater (still eagerly waiting for SE 7!) which greatly simplifies our build and deployment infrastructure. In addition to stopping those annoying compilation issues when developing on SE 6 but compiling on SE 5 (String.isEmpty() i am talking about you)

After seeing too many developers place asserts in JAX-RS/Jersey code to check that injection was working i simply could not stand by any longer. What had been put of for way too long is now implemented in Jersey 1.3 and dependency related errors will occur on deployment. As many errors as possible will be displayed to avoid a compile fix loop.

We added a nice little addition to Guice so that singleton-based provider classes can be injected using the @Inject semantics, see the JerseyServletModule. Unfortunately due to Guice's restriction in binding it is not currently possible to support the @\*Params in the same manner. However, IMHO, such extensions using modules is way better than the extensibility approach defined by CDI (see later). All i need to do is find the time to tweak Guice as after having looked at the code i estimate only minor changes to the API and implementation are required.

For the next release, 1.4, we are going to improve the CDI integration. Roberto is doing some seriously impressive Java magic in the Jersey CDI extension class and has it working in a branch. This will mean all JAX-RS artifacts, such as UriInfo and @QueryParam will work with @Inject. CDI has the virtue of being more extensible than Guice (with the set of shoot yourself in the foot implementations being much larger than the set of workable implementations) but IMHO the approach is not modular nor deterministic if one or more extension is present. Or to put it more succinctly: Guice is better. However, CDI is in Java EE 6 so we must make Jersey work well with CDI.

Jakub continues to improve the OSGi integration, which is proving particularly tricky as we are effectively managing 4 platforms: non-OSGI, pure OSGI (tested on Felix), GlassFish OSGi; and Web/war deployment.

Pavel has been making improvements to the test framework and recently added experimental support for JRebel. A sample will be included in the near future.

A new team member, Jon, has joined us to help work on testing, our Hudson infrastructure, and the test framework. He is already up and running tidying up niggles in our inconsistent documentation.

We continue to ensure that Atmosphere, which recently cranked out a 0.6 release with loads of stuff, works smoothly with Jersey. For 0.7 we may have something interesting to say about high-level integration with WebSocket, stay tuned for more details on that (and for a session at JavaOne).

Monday May 10, 2010

We have just released version 1.2 of Jersey, the open source,
production quality, reference implementation of JAX-RS. The JAX-RS 1.1 specification
is available at the JCP web site and also available in non-normative
HTML here.

The main driver for this release is basic OSGi support. This has been hard work as Jakub will testify. Most of Jakub's time was spent on testing.

Currently only the jersey-core, jersey-server, jersey-client and jersey-json modules have been made OSGi aware (the other modules will be completed in the next release). The following deployment scenarios work. Deploying using Grizzly or Jetty with the OSGi HTTP service (see osgi-http-service sample) and deploying OSGi war-bundles to Jetty (see helloworld-osgi-webapp sample). Deployment requires that root resource and provider classes are explicitly declared (the next release will hopefully support package scanning).

For the next release, 1.3, Jersey will only work on Java SE 6 or greater.

Thursday Mar 11, 2010

We have just released version 1.1.5.1 of Jersey, the open source, production quality, reference implementation of JAX-RS. The JAX-RS 1.1 specification is available at the JCP web site and also available in non-normative HTML here.

Wednesday Jan 20, 2010

We have just released version 1.1.5 of Jersey, the open source, production quality, reference implementation of JAX-RS. The JAX-RS 1.1 specification is available at the JCP web site and also available in non-normative HTML here.

It will be available soon from the GlassFish v2 and v3 update centers.

This release will align with the soon to be released of Atmosphere 0.5.

Deployment to Google App Engine now works and we have a tracing mechanism (inspired from Hudson) to aid debugging.

In between releasing 1.1.4.1 and 1.1.5 Bill Burke's JAX-RS book has been published. I have not had a chance to look at the book in detail, but it appears generally well received from the tweets i have seen. The examples in the book require RESTEasy so Pavel, with Bill's permission, converted those samples to work with Jersey and, with much help of Alexis Moussine-Pouchkine, embedded GlassFish. The examples required minimal modifications to the web.xml (Java EE 6 solves that problem!) and some minor tweaks to reach parity with some RESTEasy specific features (specifically around configuration of URI content negotiation and human readable formatting of XML responses). Overall the portability of the examples was very good. You can find the samples here.

Jakub has made some good progress on OSGi, many thanks to the developers who have helped test and provide feedback. It is in the trunk, but we decided not to connect it up to the build and deployment process until we have more thoroughly tested the implementation and investigated some areas for further improvement. (It certainly has not been trivial to develop good and robust OSGi support!)

So when OSGi support is ready we will release the next version of Jersey, 1.2.

Meanwhile Santiago has been very busy investigating better hypermedia support for both the Jersey client and server. There is a prototype sample in a branch that reflects Santiago's current thinking.

I wanted to upload the Sparklines sample but the AWT graphics stuff is currently blacklisted (like java.awt.image.BufferedImage).

When you deploy a Jersey application to GAE you will currently get some errors in the logs in the logs such as:

com.sun.jersey.core.spi.component.ProviderFactory __getComponentProvider:
The provider class, class com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App,
could not be instantiated. Processing will continue but the class will not be utilized

This is because Jersey cannot load the JAXB-related components as JAXB related classes are currently black listed. As i understand JAXB will be supported in Google App Engine version 1.2.8. So these deployment errors will go away.

The code is in the trunk and should take a couple of hours for artifacts to be pushed to the repo.

Friday Nov 27, 2009

A common complaint we have been hearing is that JAX-RS/Jersey can be hard to debug when the application is not behaving as expected, for example "why the \*!@& is my resource class not matching and instead the client is receiving a 404 response?"

It is difficult for the devloper to know what is going on because there is no visibility to how the request is matched and dispatched to the application.

A number of JAX-RS and Jersey features were inspired by Stapler the underlying Web/HTTP framework for Hudson. And tracing is another idea. With Hudson it is possible set a system property and trace messages in the form of response headers will be returned to the client, as described here.

Jersey now supports the same feature implemented in 1.1.5-ea-SNAPSHOT. Adding the following servlet/filter initialization parameter enables tracing:

If we modify the bookstore sample to include the above initialization parameter in the web.xml and go to the URL http://localhost:8080/bookstore/items/3/tracks/2/ then analyze the response headers using firebug we can see:

Trace headers have a number associated with. Not all clients or servers may preserve the order in which headers are written (the Jersey server and client does) so the numbering is useful to re-construct the order of tracing. It also helps when referring to a particular trace statement.

presents what regular expression was matched in trace 001, "(/.\*)?". It is called "accept right hand path" because some left hand path of the request URI has been matched by an @Path declaration, "", leaving some right hand path of the request URI, "/items/3/tracks/2/", to be further matched (the URI matching process will terminate when there is no right hand path left).

presents the sub-resource locator that was invoked on the Bookstore resource. In this case it is the Java method getItem annotated with @Path("/items/{itemsid}"). This sub-resource locator returns an instance of the CD resource to match more of the right hand path, "/tracks/2".

The same pattern for traces 004 to 006 repeats itself for traces 007 to 009 with a sub-resource locator being matched on the CD resource that returns a Track resource.

Trace 010 indicates that URI matching has completed because there is no right hand path left and resource methods are ready to be matched.

presents that an implicit view has been selected to process the GET request. The Track resource is the controller and the model, the JSP "/com/sun/jersey/samples/bookstore/resources/Track/index.jsp" is the view that processes the model.

presents that a message body writer was matched to process the response entity returned by the implicit view in trace 012. The ViewableMessageBodyWriter is selected to write a ResolvedViewable with the media type "text/html;qs=5".

The above traces present how Jersey is returning an HTML page to the browser. Curl can be utilized to obtain XML instead:

The traces are the same as previously presented up to trace 012. Trace 012 presents the resource method getXml that is invoked on the Track resource. Trace 013 presents that XMLRootElementProvider has been selected to serialize out Track with the media type "application/xml".

Thursday Nov 26, 2009

We have just released version 1.1.4.1 of Jersey, the open source, production quality, reference implementation of JAX-RS. The JAX-RS 1.0 specification and the 1.1 change log is available at the JCP web site and also available in non-normative HTML here.

This is a bug fix release for bugs that were found by community members who quickly tested the 1.1.4 release. Many thanks to Ari, Chris, Herak and Ian for reporting issues.

It will be available soon from the GlassFish v2 and v3 update centers,
is included in the latest GlassFish v3 builds and, assuming there are
no show stoppers, this version will be included in the final GlassFish
v3 release scheduled for December 10th.

Looks like we are getting more demands to work on Google App Engine (based on comments on my previous blog and on the Jersey users list). This is going to require some re-factoring of certain functionality that utilizes javax.naming. But first i need to get a GAE account!

Thursday Nov 12, 2009

We have just released version 1.1.4 of Jersey, the open source, production quality, reference implementation of JAX-RS. The JAX-RS 1.0 specification and the 1.1 change log is available at the JCP web site and also available in non-normative HTML here.

It will be available soon from the GlassFish v2 and v3 update centers, is included in the latest GlassFish v3 builds and, assuming there are no show stoppers, this version will be included in the final GlassFish v3 release scheduled for December 10th.

This release integrates with other Java EE 6 technologies such as Servlet 3.0, EJB 3.1, managed beans and JCDI 1.0 and contains many bug fixes. See change log here.

The next release, 1.1.5, is tentatively scheduled for December or January. Hopefully this time we can fully resolve the OSGi'ification of Jersey that we have been promising for a while. In addition, now that the Java EE 6 features are done, we hope to resume some experimentation and new features and ensure we have good integration with Atmosphere.

This is mostly a minor enhancement and bug fixing release. See change log here.

Naresh and I worked on improving the Jersey Test Framework. This breaks compatibility with the previous version in 1.1.1-ea but hopefully developers will see the improvements (note that many but not all Jersey samples use the test framework and eventually all samples will use it). See the API here.

Pavel worked on integrating some very basic GlassFish probes into the hierarchical matching algorithm and has wired them up to the GlassFish monitoring framework so it is possible to report simple statistics on which resource classes get matched to request URIs.

Two interesting developments of note:

The Glassfish v3 RESTful interface for management and monitoring is progressing nicely. It needs to use a Jersey container request filter to massage the Accept header such that if HTML and XML-based media types are present the former always has the higher quality. Then the HTML representations will be returned when Safari is used.

Akka is an Actor-based framework with Software Transactional Memory that is written in Scala. It can expose it's components RESTfully using Jersey and Cometfully ( ;-) ) using Atmosphere.

Next release

The next release, 1.1.3, is tentatively scheduled for the final release of Glassfish v3 in November and is dependent on alignment with other EE 6
technologies such as Servlet 3.0 and JSR 299/330. In addition we plan
to implement full OSGi support thanks to the help and guidance of
Richard Wallace (unfortunately we had no time to implement that for 1.1.2).

Wednesday Jul 15, 2009

We have just released version 1.1.1-ea of Jersey, the open source, production quality, reference implementation of the draft JAX-RS 1.1
API. The JAX-RS 1.0 specification and the 1.1 change log is available at the JCP web site and also available in non-normative HTML here.

It will be available soon from the GlassFish v2 and v3 update centers, and will be shipped with the latest GlassFish v3 builds.

Between releases there has been some very interesting developments with a "sister" projected called Atmosphere. If you are interested in portable Comet support and how to avail of high-level ease of use support with Jersey check out JFA's latest blog entries.

This release took a little longer than expected with holidays post JavaOne, alignment with a version of JAXB for JSON namespace related features, a last minute XML-related security fix, and being hindered by the java.net infrastructure:

Jakub has implemented the eagerly anticipated JSON namespace support for "mapped" (the default) and the "natural" conventions. In addition we have re-factored the JSONJAXBContext such that developers can use it to marshal and unmarshal JSON with JSONMarshaller and JSONUnmarshaller respectively.

Paul Bryan and Hubert Le Van Gong have added OAuth which comprises Jersey client and server support that leverages an OAuth signature library. The modules are currently located here, but for 1.1.2-ea-SNAPSHOT and future releases they are located here.

James Strachen has integrated support for lift templates with Jersey's MVC framework. The module is located here. To see Jersey, Scala and lift in action check out the RestMQ project.

The next release, 1.1.2-ea or 1.1.2, is tentatively scheduled for late August 2009 and is dependent on alignment with other EE 6 technologies such as Servlet 3.0 and JSR 299/330. In addition we plan to implement full OSGi support thanks to the help and guidance of Richard Wallace.

Monday Jun 29, 2009

Hot on the heals of the my JAX-RS Devoxx 08 presentation on Parleys (2,094 views so far, that is my biggest audience yet :-) ) is the interview i did with Ted Neward. This was the first time i have done something like that, but i found Ted put me at ease and i enjoyed the discussion.