| <?xml version="1.0"?> |
| <!-- |
| |
| Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved. |
| |
| This program and the accompanying materials are made available under the |
| terms of the Eclipse Public License v. 2.0, which is available at |
| http://www.eclipse.org/legal/epl-2.0. |
| |
| This Source Code may also be made available under the following Secondary |
| Licenses when the conditions for such availability set forth in the |
| Eclipse Public License v. 2.0 are satisfied: GNU General Public License, |
| version 2 with the GNU Classpath Exception, which is available at |
| https://www.gnu.org/software/classpath/license.html. |
| |
| SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 |
| |
| --> |
| |
| <!DOCTYPE chapter [<!ENTITY % ents SYSTEM "jersey.ent" > %ents;]> |
| <chapter xmlns="http://docbook.org/ns/docbook" |
| version="5.0" |
| xml:lang="en" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xmlns:xlink="http://www.w3.org/1999/xlink" |
| xsi:schemaLocation="http://docbook.org/ns/docbook http://docbook.org/xml/5.0/xsd/docbook.xsd |
| http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd" |
| xml:id="migration"> |
| <title>Migration Guide</title> |
| |
| <section xml:id="mig-2.26"> |
| <title>Migrating from Jersey 2.25 to &version;.</title> |
| <section xml:id="mig-2.26-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| The most fundamental change in Jersey 2.26 and later is that all the modules (including the client |
| module) are now being built with Java SE 8 and with 1.8 language level. |
| </para> |
| <para> |
| As a consequential change, one of the modules was dropped, the <literal>rx-client-jsr166e</literal>. |
| This implementation relied on the |
| <literal>ConcurrentHashMapV8</literal> |
| and was made redundant by the JDK upgrade. Please use |
| <literal>rx-client-java8</literal> |
| instead. |
| </para> |
| <para> |
| Spring version used in the extension module was upgraded to 4.2.1.RELEASE. The reason for that is lack |
| of Java 8 support with Spring 3.x versions. Optionally, an extension module for Spring 5 can be used. |
| </para> |
| <para> |
| Jersey proprietary reactive client API has been dropped and replaced by JAX-RS 2.1 Reactive Client API. |
| The backwards compatibility rule couldn't be respected in this case, since the JAX-RS API are based on |
| what was done in Jersey and there were unresolvable code incompatibilities. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section xml:id="mig-2.26-injection-manager"> |
| <title>Breaking Changes - Injection Manager</title> |
| <para>Following breaking changes are caused by removing and replacing HK2 (<literal>ServiceLocator</literal>) by |
| &jersey.common.internal.inject.InjectionManager;. Jersey injection API is considered as an internal API (except |
| &lit.jersey.common.internal.inject.InjectionManager;) </para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Classes in which <literal>HK2 ServiceLocator</literal> was simply replaced by |
| &jersey.common.internal.inject.InjectionManager; and the replacing influenced their public methods: |
| <simplelist> |
| <member>&jersey.server.model.MethodHandler;</member> |
| <member>&jersey.server.spi.ComponentProvider;</member> |
| <member>&jersey.server.spi.ExternalRequestScope;</member> |
| <member>&jersey.server.WadlGeneratorConfig;</member> |
| <member>&jersey.server.spi.RequestScopedInitializer;</member> |
| </simplelist> |
| </para> |
| <para> |
| Support for <literal>HK2 Binder</literal> in the case of using HK2 Injection Module was implemented |
| but Jersey newly supports a registration its own &jersey.common.internal.inject.AbstractBinder; and |
| &jersey.common.internal.inject.Binder; in &jaxrs.core.Application; to easily switch from HK2 classes |
| to Jersey ones just by adjusting the imports. |
| </para> |
| <para> |
| &lit.jersey.common.internal.inject.InjectionManager; contains a mechanism for registering DI specific |
| injection bindings, in case the application uses CDI, developers should use CDI mechanism, in case the |
| application uses HK2, developers should configure HK2 - ideally via configuring a parent locator that |
| is then passed to Jersey. The custom bindings can be also registered through &jaxrs.core.Application; |
| if &lit.jersey.common.internal.inject.InjectionManager; supports the bindings type that means that |
| <literal>InjectionManager#isRegistrable</literal> returns <literal>true</literal>; |
| </para> |
| <para> |
| In &jersey.server.ResourceConfig; and &jersey.client.ClientConfig; configuration methods for |
| auto-discoverable components and meta-components (e.g. &lit.jaxrs.core.Feature;) accept |
| &lit.jersey.common.internal.inject.InjectionManager; and moreover the meta-components accept |
| <literal>ManagedObjectFinalizer</literal> which ensures a pre-destroy method invocation on registered |
| components. |
| </para> |
| <para> |
| Method <literal>getTemplateObjectFactory</literal> in |
| &jersey.server.mvc.spi.AbstractTemplateProcessor; accepts a function that initializes a retrieved |
| template factory from a configuration, usually this function is just a wrapper with underlying |
| &lit.jersey.common.internal.inject.InjectionManager; invocation. |
| </para> |
| <literal>HK2 Factory</literal> support is replaced by <literal>java.util.function.Supplier</literal> |
| and Jersey-specific &jersey.common.internal.inject.DisposableSupplier;. |
| <para> |
| HK2-specific annotations <literal>@Optional</literal>, <literal>@Immediate</literal>, |
| <literal>@Unqualified</literal> are no longer supported directly in Jersey but can be used if HK2 |
| Injection Module is used. |
| </para> |
| <para> |
| HK2-specific annotations <literal>@PerLookup</literal> and <literal>@PerThread</literal> are migrated |
| to Jersey with an adjusted package. |
| </para> |
| </listitem> |
| <listitem> |
| If the internal Jersey injection API is to be backed by HK2, since 2.26, the following additional HK2 |
| support module is required: |
| <programlisting language="xml" linenumbering="unnumbered"><dependency> |
| <groupId>org.glassfish.jersey.inject</groupId> |
| <artifactId>jersey-hk2</artifactId> |
| <version>&version;</version> |
| </dependency></programlisting> |
| </listitem> |
| <listitem> |
| The direct support for <literal>HK2 Binder</literal> being able to be registered as in pre 2.26 Jersey has |
| been returned back in Jersey 2.29. Note, however, this is for backward compatibility purposes and |
| not a preferred way of registering injectables; the <literal>HK2 Binder</literal> support may be removed |
| in the future versions of Jersey. |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section xml:id="mig-2.26-removed-deprecated"> |
| <title>Removed deprecated APIs</title> |
| <para>Following, already deprecated, APIs were removed:</para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| &lit.jersey.logging.LoggingFilter; has been removed. Use &jersey.logging.LoggingFeature; instead. See |
| <link linkend="logging">Logging chapter</link>. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section> |
| <title>Migrating from Jersey 2.22.1 to 2.25</title> |
| <section xml:id="mig-2.23-highlights"> |
| <title>Release 2.23 Highlights</title> |
| |
| <section> |
| <title>Introducing LoggingFeature</title> |
| <para> |
| From version 2.23 onwards, &lit.jersey.logging.LoggingFilter; has been replaced |
| with &jersey.logging.LoggingFeature;. |
| </para> |
| </section> |
| </section> |
| <section xml:id="mig-2.23-new-deprecated"> |
| <title>Deprecated APIs</title> |
| <para>Following APIs were deprecated:</para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| &lit.jersey.logging.LoggingFilter; has been marked as deprecated and will be removed in a subsequent |
| release. Use &jersey.logging.LoggingFeature; instead. See chapter<link linkend="logging"> |
| logging</link>. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.23-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| Last version contained a change in relative URI resolution in the location header. Even though the change |
| was fixing the discrepancy between the real behaviour and RFC7231, it also caused JAX-RS spec |
| incompatibility |
| in some cases. Furthermore, there was no way to preserve backwards compatibility. |
| </para> |
| <para> |
| Therefore, the default behaviour was rollbacked and a new configuration property was introduced to switch |
| to the RFC7231 compliant |
| behaviour: &jersey.server.ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_RFC7231;. Also, |
| the possibility to switch the URI resolution completely off remains with the |
| &jersey.server.ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_DISABLED; disabled switch. Both |
| properties are false by default. |
| </para> |
| </section> |
| |
| <section xml:id="mig-2.22.1"> |
| <title>Migrating from Jersey 2.22 to 2.22.1</title> |
| <section xml:id="mig-2.22.1-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| Last version contained a change in relative URI resolution in the location header. Even though the change was |
| fixing the discrepancy between the real behaviour and RFC7231, it also caused JAX-RS spec incompatibility in some |
| cases. Furthermore, there was no way to preserve backwards compatibility. |
| </para> |
| <para> |
| Therefore, the default behaviour was rollbacked and a new configuration property was introduced to switch to the |
| RFC7231 compliant behaviour: &jersey.server.ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_RFC7231;. |
| Also, the possibility to switch the URI resolution completely off remains with |
| the &jersey.server.ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_DISABLED; disabled switch. Both |
| properties are false by default. |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.22"> |
| <title>Migrating from Jersey 2.21 to 2.22</title> |
| <section xml:id="mig-2.22-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| In previous Jersey versions, if the resource method created a response containing relative URI in the |
| <literal>Location</literal> |
| http header, the URI was resolved against |
| <emphasis>base uri</emphasis> |
| of the application. This behaviour was not correct, as pointed out by &jersey.jira.2883;. With this |
| change, the URI is, by default, resolved against <emphasis>request base uri</emphasis>. |
| </para> |
| <para> |
| For example, having a resource at <literal>http://server.com/api/management/user</literal>, that |
| returns response with <literal>Location: foo</literal>, while the root of the app is |
| <literal>http://server.com/api</literal>, the resulting URI will be: |
| <simplelist> |
| <member>with Jersey 2.21 and earlier: |
| <literal>http://server.com/api/foo</literal> |
| </member> |
| <member>with Jersey 2.22: |
| <literal>http://server.com/api/management/foo</literal> |
| </member> |
| </simplelist> |
| </para> |
| <para> |
| Please note, that the trailing slash is significant, so that if the URI ends with a slash (<literal> |
| http://server.com/api/management/user/</literal>), the output will be: |
| <simplelist> |
| <member>with Jersey 2.21 and earlier: |
| <literal>http://server.com/api/foo</literal> |
| </member> |
| <member>with Jersey 2.22: |
| <literal>http://server.com/api/management/user/foo</literal> |
| </member> |
| </simplelist> |
| </para> |
| <para> |
| Alternatively, the entire URI resolving logic can be switched off by newly |
| introduced &jersey.server.ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_DISABLED; property. |
| If the value is <literal>true</literal>, Jersey will not change the URI contained in the |
| <literal>Location</literal> |
| header at all (even if this behaviour may not match with behaviour described in JavaDoc). |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.20"> |
| <title>Migrating from Jersey 2.19 to 2.20</title> |
| |
| <section xml:id="mig-2.20-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| New parameter, <literal>org.glassfish.hk2.api.ServiceLocator</literal>, has been added |
| to &jersey.server.spi.ExternalRequestScope; methods. This is to allow 3rd party component providers to |
| hook up with the actual HK2 locator in case of multiple Jersey applications are running in parallel |
| within a single 3rd party component container. The change was driven by CDI/Servlet requirements. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.19"> |
| <title>Migrating from Jersey 2.18 to 2.19</title> |
| |
| <section xml:id="mig-2.19-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| New method, <literal>close</literal>, has been added to &jersey.server.ResourceFinder;. Its intention |
| is to release allocated/opened resources (such as streams) without a need to iterate through the |
| whole &lit.jersey.server.ResourceFinder;. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.18"> |
| <title>Migrating from Jersey 2.17 to 2.18</title> |
| |
| <section xml:id="mig-2.18-highlights"> |
| <title>Release 2.18 Highlights</title> |
| |
| <section> |
| <title>Updated to MOXy 2.6</title> |
| <para> |
| Jersey has updated version of MOXy (XML/JSON provider) to version 2.6. Among some bug fixes there are other |
| notable changes (some of them breaking) that you should be aware of: |
| |
| <itemizedlist> |
| <listitem> |
| <para> |
| <link xlink:href='https://wiki.eclipse.org/EclipseLink/DesignDocs/459464'>Redesign of type |
| property in JSON processing |
| </link> |
| - Special handling of JSON |
| <literal>type</literal> |
| property is deprecated. If there is need to identify type of JSON object - due to missing root |
| element or some special inheritance requirements, it is necessary to specify fully qualified type |
| property with |
| <literal>http://www.w3.org/2001/XMLSchema-instance</literal> |
| namespace. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <link xlink:href='https://bugs.eclipse.org/bugs/attachment.cgi?id=241506'>Bean Validation in MOXy |
| </link> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <link xlink:href='https://wiki.eclipse.org/EclipseLink/DesignDocs/405161'>MOXy support for for |
| Java API for JSON Processing (JSR-353) |
| </link> |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section> |
| <title>Promoted Public Beta APIs</title> |
| |
| <para> |
| Several experimental Jersey APIs have matured enough and as such we have decided to promote them |
| from &jersey.common.Beta; status, namely: |
| |
| <itemizedlist> |
| <listitem> |
| <para> |
| Jersey Reactive Client API. Also Reactive Client moved from incubator to extension (umbrella) |
| module. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey client-side &jersey.client.ClientLifecycleListener; SPI. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey server-side &jersey.server.ContainerLifecycleListener; SPI. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey server-side (MVC) &jersey.server.mvc.ErrorTemplate; annotation. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey test framework (client-side) &jersey.test.util.LoopBackConnectorProvider; connector. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey test framework (server-side) &jersey.test.util.ContainerRequestBuilder; class. |
| </para> |
| </listitem> |
| </itemizedlist> |
| |
| These APIs are now part of the official public Jersey 2.x API. |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.18-removed-deprecated"> |
| <title>Removed deprecated APIs</title> |
| <para>Following, already deprecated, APIs were removed:</para> |
| |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties</literal> |
| - constant |
| <literal>SSL_CONFIG</literal> |
| has been removed. Use &jaxrs.client.ClientBuilder; methods to configure SSL in a &jaxrs.client.Client; |
| instance. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.jetty.connector.JettyClientProperties</literal> |
| - constant |
| <literal>SSL_CONFIG</literal> |
| has been removed. Use &jaxrs.client.ClientBuilder; methods to configure SSL in a &jaxrs.client.Client; |
| instance. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>FreemarkerMvcFeature.TEMPLATES_BASE_PATH</literal> |
| - constant has been unified across MVC modules and the deprecated one has been removed. Use |
| <literal>FreemarkerMvcFeature.TEMPLATE_BASE_PATH</literal> |
| or property |
| <literal>jersey.config.server.mvc.templateBasePath.freemarker</literal> |
| instead. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>JspMvcFeature.TEMPLATES_BASE_PATH</literal> |
| - constant has been unified across MVC modules and the deprecated one has been removed. Use |
| <literal>JspMvcFeature.TEMPLATE_BASE_PATH</literal> |
| or property |
| <literal>jersey.config.server.mvc.templateBasePath.jsp</literal> |
| instead. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| |
| <section xml:id="mig-2.18-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Integration of executor providers for Jersey runtime has been unified and refactored. As a result, the |
| <literal>org.glassfish.jersey.spi.RequestExecutorProvider</literal> |
| and |
| <literal>org.glassfish.jersey.spi.RuntimeThreadProvider</literal> |
| SPIs have been removed from Jersey. A new, common & generic executor service providers have been |
| introduced instead: &jersey.common.spi.ExecutorServiceProvider; |
| and &jersey.common.spi.ScheduledExecutorServiceProvider;. These new providers are used to support |
| custom qualified executor service injection, including the refactored use cases of client asynchronous |
| request execution, server-side managed asynchronous request processing as well as server-side |
| background task scheduler. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.17"> |
| <title>Migrating from Jersey 2.16 to 2.17</title> |
| <section xml:id="mig-2.17-highlights"> |
| <title>Release 2.17 Highlights</title> |
| |
| <section> |
| <title>CDI integration in EAR packaged WARs</title> |
| <para> |
| From version 2.17 onwards, it's possible to use CDI with JAX-RS web-applications packaged in EAR. All |
| supported HK2/CDI injections now work as expected for JAX-RS application deployed in the mentioned fashion. |
| One need to make sure that modules |
| <literal>jersey-cdi1x</literal> |
| and |
| <literal>jersey-cdi1x-servlet</literal> |
| are present in Servlet container (that supports EARs). |
| </para> |
| </section> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.16"> |
| <title>Migrating from Jersey 2.15 to 2.16</title> |
| <section xml:id="mig-2.16-highlights"> |
| <title>Release 2.16 Highlights</title> |
| |
| <section> |
| <title>JAX-B providers separated from the core</title> |
| <para> |
| From version 2.16 onwards, all JAX-B providers are being bundled in a separate module. |
| </para> |
| </section> |
| <section> |
| <title>Performance gain when using Sub-Resource Locators</title> |
| <para> |
| We improved the performance for using sub-resource locators in a Jersey application. The performance gains |
| are available for cases when the sub-resource locator method returns either a resource class (return value is |
| e.g. |
| <literal>Class<?></literal> |
| or<literal>Class<MySubResource></literal>) or a (non-proxied) resource instance (when return value is an |
| instance of |
| <literal>MySubResource</literal> |
| class). |
| </para> |
| </section> |
| <section> |
| <title>More unified connector configuration options</title> |
| <para> |
| Jetty connector and Apache connector have been previously using their own custom properties to set SSL context |
| on a connector. These properties have been deprecated and the code has been updated to read the SSL context |
| information from the JAX-RS client configuration. This means that all Jersey connectors now properly accept |
| SSL configuration as configured via standard JAX-RS &jaxrs.client.ClientBuilder; methods. |
| </para> |
| <para> |
| Previously, all Jersey connectors have been using their own default chunk size when HTTP chunked coding was |
| used. Since Jersey 2.16, there is a new default chunk size value used by all connectors, if a custom chunk |
| size is not set. The new default value is stored under &jersey.client.ClientProperties.DEFAULT_CHUNK_SIZE; |
| client property. |
| </para> |
| </section> |
| </section> |
| <section xml:id="mig-2.16-new-deprecated"> |
| <title>Deprecated APIs</title> |
| <para>Following APIs were deprecated:</para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties</literal> |
| - constant |
| <literal>SSL_CONFIG</literal> |
| has been marked as deprecated and will be removed in a subsequent release. |
| Use &jaxrs.client.ClientBuilder; methods to configure SSL in a &jaxrs.client.Client; instance. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.jetty.connector.JettyClientProperties</literal> |
| - constant |
| <literal>SSL_CONFIG</literal> |
| has been marked as deprecated and will be removed in a subsequent release. |
| Use &jaxrs.client.ClientBuilder; methods to configure SSL in a &jaxrs.client.Client; instance. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section xml:id="mig-2.16-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| JAX-B support modularization might cause breaking changes for those users relying on JAX-B and |
| directly referring to the Jersey core-common module: |
| <programlisting language="xml" linenumbering="unnumbered"> |
| <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> |
| <version>${pre-2.16-version}</version> </dependency></programlisting> |
| The following needs to be included in addition from version 2.16 on: |
| <programlisting language="xml" linenumbering="unnumbered"> |
| <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-jaxb</artifactId> |
| <version>&version;</version> </dependency></programlisting> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>MediaType</literal>'s quality source parameters (<literal>qs</literal>) reuse the same |
| parsing as quality parameters. This means that values higher than |
| <literal>1.0</literal> |
| throw ParseException. I.e. following example is not allowed any more: |
| <programlisting language="java" linenumbering="unnumbered"> |
| @Path("/") @Produces("text/html;qs=5") // wrong 'qs' value public class Bookstore { ... } |
| </programlisting> |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.15"> |
| <title>Migrating to 2.15</title> |
| <section xml:id="mig-2.15-highlights"> |
| <title>Release 2.15 Highlights</title> |
| |
| <section> |
| <title>Container agnostic CDI support</title> |
| <para> |
| Before 2.15, CDI integration was supported primarily in Java EE containers with built-in CDI support. From |
| version 2.15 onwards, it is possible to leverage CDI integration also outside of Java EE environment. A new |
| example,<link xlink:href='https://github.com/jersey/jersey/tree/master/examples/helloworld-weld'> |
| helloworld-weld</link>, has been introduced to demonstrate the new feature using Grizzly HTTP server. Another |
| example application,<link xlink:href='https://github.com/jersey/jersey/tree/master/examples/cdi-webapp'> |
| cdi-webapp</link>, has been updated so it enables Apache Tomcat Server deployment. |
| </para> |
| </section> |
| |
| </section> |
| |
| <section xml:id="mig-2.15-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| CDI support improvement caused breaking changes for those users directly referring to the following |
| CDI supporting Jersey module in maven: |
| <programlisting language="xml" linenumbering="unnumbered"> |
| <dependency> <groupId>org.glassfish.jersey.containers.glassfish</groupId> <artifactId>jersey-gf-cdi</artifactId> |
| <version>${pre-2.15-version}</version> </dependency></programlisting> |
| The above dependency needs to be replaced with: |
| <programlisting language="xml" linenumbering="unnumbered"> |
| <dependency> <groupId>org.glassfish.jersey.ext.cdi</groupId> <artifactId>jersey-cdi1x</artifactId> |
| <version>&version;</version> </dependency></programlisting> |
| The following needs to be included in addition if you want to leverage CDI JTA support: |
| <programlisting language="xml" linenumbering="unnumbered"> |
| <dependency> <groupId>org.glassfish.jersey.ext.cdi</groupId> <artifactId>jersey-cdi1x-transaction</artifactId> |
| <version>&version;</version> </dependency></programlisting> |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| |
| <section xml:id="mig-2.12"> |
| <title>Migrating from Jersey 2.11 to 2.12</title> |
| <section xml:id="mig-2.12-highlights"> |
| <title>Release 2.12 Highlights</title> |
| <para>Following experimental APIs have been promoted to become part of public Jersey API: |
| <itemizedlist> |
| <listitem> |
| <para> |
| Jersey client-side &jersey.client.HttpAuthenticationFeature; API. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey server-side &jersey.server.monitoring.DestroyListener; (formerly |
| <literal>ExtendedMonitoringStatisticsListener</literal>), which has been slightly refactored and is |
| now a separate interface (e.g. not extending<literal>MonitoringStatisticsListener</literal>), hence |
| providing better compatibility with lambdas. |
| </para> |
| </listitem> |
| </itemizedlist> |
| These APIs are now part of the official public Jersey 2.x API. |
| </para> |
| </section> |
| <section xml:id="mig-2.12-breaking-changes"> |
| <title>Breaking Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Because of a bug fix for issue |
| <link xlink:href='https://java.net/jira/browse/JERSEY-2602'>JERSEY-2602</link>, we re-generate WADL |
| classes from |
| <literal>wadl.xsd</literal> |
| to make sure the getters for boolean properties starts with |
| <literal>is</literal> |
| instead of |
| <literal>get</literal> |
| as in Jersey 1 and Jersey <= 2.6. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| For performance purposes a new server property &jersey.server.ServerProperties.MONITORING_ENABLED; has |
| been introduced. It is possible to enable just basic almost static monitoring information using the |
| property. It allows to inject &jersey.server.monitoring.ApplicationInfo; object, renamed original |
| class <literal>org.glassfish.jersey.server.monitoring.ApplicationStatistics</literal>. |
| And &jersey.server.monitoring.MonitoringStatistics; no more have a reference to<literal> |
| ApplicationStatistics</literal>, method |
| <literal>getApplicationStatistics()</literal> |
| has been removed. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.11"> |
| <title>Migrating from Jersey 2.10 to 2.11</title> |
| |
| <section xml:id="mig-2.11-highlights"> |
| <title>Release 2.11 Highlights</title> |
| |
| <section> |
| <title>Promoted Public Beta APIs</title> |
| |
| <para> |
| Several experimental Jersey APIs have matured enough and as such we have decided to promote them |
| from &jersey.common.Beta; status, namely: |
| |
| <itemizedlist> |
| <listitem> |
| <para> |
| Jersey client-side &jersey.client.ConnectorProvider; SPI. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Jersey server-side &jersey.server.ResponseErrorMapper; SPI. |
| </para> |
| </listitem> |
| </itemizedlist> |
| |
| These APIs are now part of the official public Jersey 2.x API. |
| </para> |
| </section> |
| <section> |
| <title>Not closing provided streams in message body providers</title> |
| |
| <para> |
| Jersey is now preventing message body providers (MBR, MBW) from closing given input/output stream. With this |
| change Jersey is enforcing the JavaDoc statements present in message body providers. |
| </para> |
| </section> |
| <section> |
| <title>Jackson 1</title> |
| |
| <para> |
| We have reintroduced support for JSON processing via Jackson 1.x JSON provider (1.9.11). In order to use |
| Jackson 1 in your application you need to add |
| <literal>jersey-media-json-jackson1</literal> |
| module (+ its dependencies) to your class-path and register |
| <literal>Jackson1Feature</literal> |
| in your application (server or client). |
| </para> |
| </section> |
| <section> |
| <title>ClientLifecycleListener</title> |
| <para> |
| Client-side providers (such as<literal>ClientRequestFilter</literal>s) implementing the new |
| <literal>org.glassfish.jersey.client.ClientLifecycleListener</literal> |
| interface will be notified when various lifecycle events occur. Currently client runtime initialization |
| triggers the |
| <literal>onInit()</literal> |
| method and client closing triggers |
| <literal>onClose()</literal> |
| method. Such providers implementing the |
| <literal>ClientLifecycleListener</literal> |
| can be registered in a common way, e.g. into a |
| <literal>JerseyClient</literal> |
| or |
| <literal>JerseyWebTarget</literal> |
| instance, or into a (potentially) auto discoverable feature context. |
| </para> |
| </section> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.10"> |
| <title>Migrating from Jersey 2.9 to 2.10</title> |
| |
| <section xml:id="mig-2.10-removed-deprecated"> |
| <title>Removed deprecated APIs</title> |
| <para>Following, already deprecated, APIs were removed:</para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.model.ResourceModelContext</literal> |
| (not used) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.model.ResourceModelListener</literal> |
| (not used) |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.9"> |
| <title>Migrating from Jersey 2.8 to 2.9</title> |
| |
| <section xml:id="mig-2.9-highlights"> |
| <title>Release 2.9 Highlights</title> |
| |
| <section> |
| <title>Declarative Linking</title> |
| |
| <para> |
| Gerard updated the Declarative Linking extension module which has been ported to Jersey 2 in version 2.6. You |
| can read more about what Declarative Linking does and what it's capable of in the following blog posts: |
| |
| <itemizedlist> |
| <listitem> |
| <para> |
| <link xlink:href='http://kingsfleet.blogspot.co.uk/2014/05/declarative-linking-in-jersey-29.html'> |
| Declarative Linking in Jersey 2.9 and up |
| </link> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <link xlink:href='http://kingsfleet.blogspot.co.uk/2014/05/reading-and-writing-jax-rs-link-objects.html'> |
| Reading and writing JAX-RS Link objects |
| </link> |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section> |
| <title>Jackson 2</title> |
| |
| <para> |
| Our media module that supports working with JSON via Jackson library has been updated to use Jackson 2.x |
| (2.3.2). All samples and tests have been rewritten to use Jackson 2 as well. In order to use Jackson 2 in your |
| application you need to add jersey-media-json-jackson (+ its Jackson dependencies) to your class-path and |
| register |
| <literal>JacksonFeature</literal> |
| in your application. |
| </para> |
| </section> |
| <section> |
| <title>META-INF/services</title> |
| |
| <para> |
| We dropped automatic registration of message body providers (MessageBodyWriter, MessageBodyReader) and |
| exception mappers via META-INF/services mechanism. This functionality can be restored by adding |
| <literal>jersey-metainf-services</literal> |
| module to the class-path of your application. |
| </para> |
| <para> |
| Note: This change may affect 3rd party libraries (e.g. Jackson 2.x) in a way their provider would not be |
| registered in an JAX-RS app. You need to either register them manually or use mentioned |
| <literal>jersey-metainf-services</literal> |
| module. |
| </para> |
| </section> |
| <section> |
| <title>Jersey Test Framework</title> |
| |
| <para> |
| Jersey Test Framework now supports TestNG to run the tests (in addition to the JUnit, which is supported by |
| default). You can now run the tests in parallel using either JUnit or TestNG. See chapters dedicated to TestNG |
| and parallel testing for more information: |
| <xref linkend="testng"/> |
| and <xref linkend="parallel"/>. |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-2.9-breaking-changes"> |
| <title>Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Some of the feature specific configuration properties (disable WADL, disable BV, disable |
| JSON-Processing, enable Monitoring), and their server/client counterparts, are no longer affected by a |
| value of properties |
| <literal>CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE</literal> |
| or |
| <literal>CommonProperties.METAINF_SERVICES_LOOKUP_DISABLE</literal>. The specific properties have to |
| be used to change default behaviour of mentioned features (e.g. |
| <literal>ServerProperties.WADL_FEATURE_DISABLE</literal>). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Automatic registration of <literal>MessageBodyWriter</literal>, |
| <literal>MessageBodyReaders</literal> |
| and |
| <literal>ExceptionMappers</literal> |
| via |
| <literal>META-INF/services</literal> |
| mechanism has been removed. Disabling the automatic registration of providers via |
| <literal>META-INF/services</literal> |
| may affect 3rd party libraries (i.e. Jackson 2.x) that are using this mechanism to register its |
| providers. In order to restore this functionality the |
| <literal>org.glassfish.jersey.ext:jersey-metainf-services</literal> |
| has to be added on the classpath. Otherwise such providers has to be registered manually. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The Jackson JSON Jersey module has been updated to use Jackson 2.x instead of Jackson 1.x. This means |
| that all the code that has been using Jackson 1.x for JSON (de)serialization has to be migrated to |
| Jackson 2.x. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| <section xml:id="mig-2.8"> |
| <title>Migrating from Jersey 2.7 to 2.8</title> |
| |
| <section xml:id="mig-2.8-breaking-changes"> |
| <title>Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Because of a bug fix for issue |
| <link xlink:href='https://java.net/jira/browse/JERSEY-2458'>JERSEY-2458</link>, there has been a |
| slight change in the behavior of &jaxrs.core.UriInfo; |
| <literal>getPath</literal> |
| and |
| <literal>getPathSegments</literal> |
| methods. The |
| <literal>getPath</literal> |
| methods no longer return a path prefixed with a slash (<literal>'/'</literal>), instead they now |
| correctly return a request path |
| <emphasis>relative</emphasis> |
| to the base request URI. Also, the &lit.jaxrs.core.UriInfo; now correctly handles requests which URI |
| contains empty path segments (e.g.<literal>http://localhost///a/b//c</literal>). These empty path |
| segments are now correctly included in the lists returned by the |
| <literal>UriInfo.getPathSegments</literal> |
| methods. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| &jersey.sse.SseFeature; now gets automatically discovered and enabled if the SSE module is present on |
| the class path. This behavior can be suppressed by setting &jersey.sse.SseFeature.DISABLE_SSE; |
| property to <literal>true</literal>. The behavior can also be selectively suppressed in either client |
| or server runtime by setting the &jersey.sse.SseFeature.DISABLE_SSE_CLIENT; |
| or &jersey.sse.SseFeature.DISABLE_SSE_SERVER; property respectively. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Deprecated |
| <literal>getDestroyTime</literal> |
| method has been removed from |
| <literal>org.glassfish.jersey.server.monitoring.ApplicationStatistics</literal>. To get the |
| application shutdown information, a &jersey.server.ContainerLifecycleListener; should be registered |
| and its |
| <literal>onShutdown</literal> |
| method implemented to listen to and process the application shutdown event. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Method |
| <literal>triggerEvent(RequestEvent.Type)</literal> |
| has been removed from the public &jersey.server.ContainerRequest; API. This method has never been |
| intended for public, application-level use. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| In Jersey 2.7 and earlier it was (under certain conditions) possible to supply |
| custom &jersey.test.spi.TestContainerFactory; as part of the tested JAX-RS / Jersey application. This |
| factory would be picked and used by &jersey.test.JerseyTest; to |
| instantiate &jersey.test.spi.TestContainer; that will host the tested application. This feature was |
| unreliable and redundant. As such, support for the feature has been removed. To specify a |
| custom &lit.jersey.test.spi.TestContainerFactory; to be used by your &lit.jersey.test.JerseyTest; |
| subclass, please override the |
| <literal>JerseyTest.getTestContainerFactory</literal> |
| method instead. Overriding |
| <literal>getTestContainerFactory</literal> |
| now remains the only reliable way of specifying custom &lit.jersey.test.spi.TestContainerFactory; |
| implementation to be used in your tests. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Protected method |
| <literal>setTestContainerFactory</literal> |
| has been removed from the &lit.jersey.test.JerseyTest; API as calling the method had no effect on |
| the &lit.jersey.test.spi.TestContainerFactory; instance used by the &lit.jersey.test.JerseyTest; |
| subclass. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Protected method |
| <literal>getClient</literal> |
| has been removed from the &lit.jersey.test.JerseyTest; API. To configure test client instances, please |
| override the |
| <literal>configureClient</literal> |
| method instead. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Utility methods &lit.jersey.test.JerseyTest; that provide access to |
| pre-configured &jaxrs.client.Client; and &jaxrs.client.WebTarget; instances (<literal> |
| client()</literal>, |
| <literal>target(...)</literal>) have been made final to prevent overriding in subclasses and thus |
| ensure consistency of the jersey test framework functionality. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| &lit.jersey.test.JerseyTest; constructor |
| <literal>JerseyTest(Class<? extends Application>)</literal> |
| has been made deprecated and will be removed in the subsequent Jersey release. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| It was previously possible to pass in a custom &jersey.server.spi.ContainerProvider; that was supposed |
| to deploy and run the application as one of the JAX-RS / Jersey application providers. This ability |
| has been removed without any substitute as the concept was fundamentally flawed. Typical use cases |
| should not be affected by this change. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Factory methods |
| <literal>createHttpServer</literal> |
| which take Jersey &jersey.server.ApplicationHandler; as one of the input parameters have been removed |
| from the Jersey container factory API as inherently broken. This |
| impacts &jersey.grizzly.GrizzlyHttpServerFactory;, &jersey.jdkhttp.JdkHttpServerFactory;, &jersey.jetty.JettyHttpContainerFactory; |
| and &jersey.simple.SimpleContainerFactory; implementations. The methods that |
| take &jersey.server.ResourceConfig; as input parameter should be used instead. Typical use cases |
| should not be affected by this change. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Method |
| <literal>registerAdditionalBinders</literal> |
| on &jersey.server.ApplicationHandler; has been removed from the public API. Please use the |
| specific &lit.jersey.server.ApplicationHandler; constructor that accepts custom HK2 binders instead. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Several configuration properties were renamed, especially those having client and server versions |
| along with the common version in &lit.jersey.common.CommonProperties;. Please see following table for |
| complete reference: |
| <table> |
| <title>List of changed configuration properties:</title> |
| <tgroup cols="3"> |
| <thead> |
| <row> |
| <entry>Constant</entry> |
| <entry>Old value (Jersey 2.7 and before)</entry> |
| <entry>New value (Jersey 2.8+)</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>&jersey.client.ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableAutoDiscovery.client</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.client.disableAutoDiscovery</literal> |
| </entry> |
| </row> |
| <row> |
| <entry>&jersey.server.ServerProperties.FEATURE_AUTO_DISCOVERY_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableAutoDiscovery.server</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.server.disableAutoDiscovery</literal> |
| </entry> |
| </row> |
| |
| <row> |
| <entry>&jersey.client.ClientProperties.JSON_PROCESSING_FEATURE_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableJsonProcessing.client</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.client.disableJsonProcessing</literal> |
| </entry> |
| </row> |
| <row> |
| <entry>&jersey.server.ServerProperties.JSON_PROCESSING_FEATURE_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableJsonProcessing.server</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.server.disableJsonProcessing</literal> |
| </entry> |
| </row> |
| |
| <row> |
| <entry>&jersey.client.ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableMetainfServicesLookup.client</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.client.disableMetainfServicesLookup</literal> |
| </entry> |
| </row> |
| <row> |
| <entry>&jersey.server.ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableMetainfServicesLookup.server</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.server.disableMetainfServicesLookup</literal> |
| </entry> |
| </row> |
| |
| <row> |
| <entry>&jersey.client.ClientProperties.MOXY_JSON_FEATURE_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableMoxyJson.client</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.client.disableMoxyJson</literal> |
| </entry> |
| </row> |
| <row> |
| <entry>&jersey.server.ServerProperties.MOXY_JSON_FEATURE_DISABLE; |
| </entry> |
| <entry> |
| <literal>jersey.config.disableMoxyJson.server</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.server.disableMoxyJson</literal> |
| </entry> |
| </row> |
| |
| <row> |
| <entry>&jersey.client.ClientProperties.OUTBOUND_CONTENT_LENGTH_BUFFER; |
| </entry> |
| <entry> |
| <literal>jersey.config.contentLength.buffer.client</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.client.contentLength.buffer</literal> |
| </entry> |
| </row> |
| <row> |
| <entry>&jersey.server.ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER; |
| </entry> |
| <entry> |
| <literal>jersey.config.contentLength.buffer.server</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.server.contentLength.buffer</literal> |
| </entry> |
| </row> |
| |
| <row> |
| <entry>&jersey.server.ServerProperties.TRACING; |
| </entry> |
| <entry> |
| <literal>jersey.config.server.tracing</literal> |
| </entry> |
| <entry> |
| <literal>jersey.config.server.tracing.type</literal> |
| </entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| The old names are still working for now, but are deprecated. There is a fallback mechanism implemented |
| while reading the property and each get, that resolves the value from the old-named property, will log |
| a |
| <literal>CONFIG</literal> |
| level warning. |
| </para> |
| |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| <section xml:id="mig-2.7"> |
| <title>Migrating from Jersey 2.6 to 2.7</title> |
| |
| <section xml:id="mig-2.7-breaking-changes"> |
| <title>Changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Until version 2.6, Jersey was compiled with Java SE 6. This has changes in Jersey 2.7. Now almost all |
| Jersey components are compiled with Java SE 7 target. It means, that you will need at least Java SE 7 |
| to be able to compile and run your application that is using latest Jersey. Only |
| <literal>core-common</literal> |
| and |
| <literal>core-client</literal> |
| modules are still compiled with Java class version runnable with Java SE 6. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| MVC support: method |
| <literal>writeTo</literal> |
| of &jersey.server.mvc.TemplateProcessor; was modified by adding an argument <literal>MultivaluedMap<String, |
| Object> httpHeaders</literal>. This is an incompatible change (the method was modified directly in |
| the interface). All Jersey provided MVC implementation were adjusted but if you have your own MVC |
| implementation then you need to modify the method signature of the implementation. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| A minor JAX-RS incompatibility issue has been recently discovered and reported (see <link |
| xlink:href="https://java.net/jira/browse/JERSEY-2387">JERSEY-2387</link>). As part of the fix, |
| minor breaking changes related to URI resolving and creation have been introduced in the behavior |
| of &jaxrs.core.UriBuilder;, &jaxrs.core.Link.Builder; and &jaxrs.client.WebTarget; classes. It is no |
| longer possible to successfully build a new &lit.jdk6.URI; instance from a &lit.jaxrs.core.UriBuilder; |
| that contains unresolved template parameters. An |
| <literal>IllegalArgumentException</literal> |
| will be thrown in such case, as mandated by JAX-RS API javadoc. Similarly, it is not possible to |
| successfully create a &jaxrs.core.Link; instance from a URI template with unresolved template |
| parameters. Also, it is not possible to successfully send a request on a &lit.jaxrs.client.WebTarget; |
| that represents a URI template that does not have all the template parameters properly resolved. Any |
| attempt to do so will fail with an exception. Note that this also applies to any managed clients |
| injected into JAX-RS server-side components using &jersey.server.Uri; annotation. |
| </para> |
| <para> |
| In Jersey 2.6 and earlier, producing a URI from an incompletely resolved URI template would succeed |
| and all unresolved template parameter locations would be encoded without change into the resulting |
| URI, for example |
| <literal>"/path/{param}"</literal> |
| would be implicitly encoded as |
| <literal>"/path/%7Bparam%7D"</literal>. While we do not expect our users to depend on this |
| functionality, if the former behavior is desired for some reason, |
| <literal>UriComponent.encodeTemplateNames</literal> |
| method can be used instead: |
| |
| <programlisting language="java" linenumbering="unnumbered"> |
| URI.create(UriComponent.encodeTemplateNames(UriBuilder.fromUri("/path/{param}").toTemplate())); |
| </programlisting> |
| |
| or simply |
| |
| <programlisting language="java" linenumbering="unnumbered"> |
| URI.create(UriComponent.encodeTemplateNames("/path/{param}")); |
| </programlisting> |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| </section> |
| <section xml:id="mig-2.6"> |
| <title>Migrating from Jersey 2.5.1 to 2.6</title> |
| |
| <section xml:id="mig-2.6-repackaged"> |
| <title>Guava and ASM have been embedded</title> |
| <para> |
| Jersey no longer depend directly on Guava and ASM artifacts which means that users are free to use their own |
| versions of mentioned libraries. |
| </para> |
| <para> |
| New bundle has been created for Guava (<literal>bundles/repackaged/jersey-guava</literal>), with Maven |
| coordinates: |
| <literal>org.glassfish.jersey.bundles.repackaged:jersey-guava</literal> |
| </para> |
| <para> |
| (Repackaged) ASM is now part of Jersey Server. Jersey currently uses ASM 5 for package-scanning capabilities. |
| </para> |
| </section> |
| <section xml:id="mig-2.6-new-deprecated"> |
| <title>Deprecated APIs</title> |
| <para>Following APIs were deprecated:</para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.message.internal.HttpDateFormat</literal> |
| - method |
| <literal>getPreferedDateFormat()</literal> |
| has been marked as deprecated due to typo in the name. New method |
| <literal>getPreferredDateFormat()</literal> |
| should be used instead. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section xml:id="mig-2.6-removed-deprecated"> |
| <title>Removed deprecated APIs</title> |
| <para>Following, already deprecated, APIs were removed:</para> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.client.filter.HttpBasicAuthFilter</literal> |
| and |
| <literal>org.glassfish.jersey.client.filter.HttpDigestAuthFilter</literal> |
| (use &jersey.client.HttpAuthenticationFeature; instead) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties.HTTP_PARAMS</literal> |
| (use |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties#REQUEST_CONFIG</literal> |
| instead), |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties.PROXY_URI</literal>, |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties.PROXY_USERNAME</literal>, |
| <literal>org.glassfish.jersey.apache.connector.ApacheClientProperties.PROXY_PASSWORD</literal> |
| (use corresponding &jersey.client.ClientProperties; instead. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.validation.ValidationConfig.setMessageInterpolator</literal> |
| <literal>org.glassfish.jersey.server.validation.ValidationConfig.setTraversableResolver</literal> |
| <literal>org.glassfish.jersey.server.validation.ValidationConfig.setConstraintValidatorFactory |
| </literal> |
| <literal>org.glassfish.jersey.server.validation.ValidationConfig.setParameterNameProvider</literal> |
| (use corresponding methods of the same class without |
| <literal>"set"</literal> |
| prefix in the method names). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.mvc.MvcProperties</literal> |
| (use properties of |
| <literal>org.glassfish.jersey.server.mvc.MvcFeature</literal> |
| instead). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| MVC does not allow to specify the resolving class. Resolving class is used to create a path of the |
| template. Changes are: |
| </para> |
| <para> |
| Annotation attribute |
| <literal>Class<?> org.glassfish.jersey.server.mvc.Template.resolvingClass()</literal> |
| (the attribute was obsolete and therefore removed. Resolving class now always the resource class in |
| which the MVC resource method is defined). |
| </para> |
| <para> |
| <literal>resolvingClass</literal> |
| was removed from &jersey.server.mvc.Viewable;. The constructor no longer accepts this argument and |
| there is no getter for this field. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.mvc.freemarker.FreemarkerProperties</literal> |
| (use &jersey.server.mvc.FreemarkerMvcFeature; instead) |
| </para> |
| </listitem> |
| |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.mvc.jsp.JspProperties</literal> |
| (use &jersey.server.mvc.JspMvcFeature; instead) |
| </para> |
| </listitem> |
| |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.server.model.RuntimeResource.getFirstParentResource()</literal> |
| (use &jersey.server.Resource.getParent; instead). |
| </para> |
| </listitem> |
| |
| </itemizedlist> |
| </para> |
| </section> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| WADL is by default displayed in the simplified form. It does not contain supporting resources like OPTIONS |
| methods or |
| <literal>/application.wadl</literal> |
| itself. In order to get the full WADL use query param <literal>detail=true</literal>. For example make a |
| GET request to <literal>http://localhost:8080/application.wadl?detail=true</literal>. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| |
| |
| <section xml:id="mig-2.5.1"> |
| <title>Migrating from Jersey 2.5 to 2.5.1</title> |
| |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| WADL is by default displayed in the simplified form. It does not contain supporting resources like OPTIONS |
| methods or |
| <literal>/application.wadl</literal> |
| itself. In order to get the full WADL use query param<literal>detail=true</literal>. For example make a |
| GET request to <literal>http://localhost:8080/application.wadl?detail=true</literal>. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| |
| <section xml:id="mig-2.5"> |
| <title>Migrating from Jersey 2.4.1 to 2.5</title> |
| |
| <section xml:id="mig-2.5-client"> |
| <title>Client-side API and SPI changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <emphasis>Client chunked encoding configuration behaviour has changed:</emphasis> |
| </para> |
| <para> |
| Jersey client uses chunked encoding (streaming) for serialization of the entity as a default option. |
| Before Jersey 2.5 release entity buffering has been used by default. The size of the chunk can still |
| be controlled by &jersey.client.ClientProperties.CHUNKED_ENCODING_SIZE; property, this property |
| however no longer enforces the use of chunked encoding. To control request entity buffering and |
| chunked transfer coding selection, please utilize use the new |
| &jersey.client.ClientProperties.REQUEST_ENTITY_PROCESSING; property. The behaviour of the property |
| is however not unified across the available &jersey.client.Connector; implementations and depends |
| on the connector implementation configured for the &jaxrs.client.Client; instance. |
| Default connector produced by &jersey.client.HttpUrlConnectorProvider; still uses |
| buffering as default options due to bugs in <literal>HttpURLConnection</literal>. On the other hand, |
| Jetty HTTP Client based connectors produced by &jersey.jetty.JettyConnectorProvider; do not support |
| chunked encoding at all. |
| </para><para> |
| Please note that this is not a newly introduced limitation - it's merely |
| an official acknowledgement of the fact that different connectors have different capabilities and |
| limitations - something that has always been part of the individual connector implementations, it |
| just was not publicly acknowledged. |
| </para></listitem> |
| <listitem><para> |
| New &jersey.client.ConnectorProvider; SPI has been introduced to decouple &jersey.client.Connector; |
| instantiation from &jaxrs.client.Client; instance boot-strapping. As such, the |
| <literal>connector(Connector)</literal> |
| method has been removed from &jersey.client.ClientConfig; |
| API. It has been replaced with a newly introduced |
| <literal>connectorProvider(ConnectorProvider)</literal> |
| method. |
| </para></listitem> |
| <listitem><para> |
| <literal>org.glassfish.jersey.client.HttpUrlConnector</literal> |
| has been removed from the public API. |
| &jersey.client.HttpUrlConnectorProvider; should be used to produce &jdk6.HttpUrlConnection; |
| connector instances instead. |
| </para></listitem> |
| <listitem><para> |
| <literal>ClientProperties.HTTP_URL_CONNECTION_SET_METHOD_WORKAROUND</literal> |
| property has been moved to the new &jersey.client.HttpUrlConnectorProvider; |
| has been introduced in Jersey 2.4) has been moved to the new &jersey.client.HttpUrlConnectorProvider; |
| class as this property is specific to the connector instances created by |
| &lit.jersey.client.HttpUrlConnectorProvider; only. The property has been also renamed to |
| &jersey.client.HttpUrlConnectorProvider.SET_METHOD_WORKAROUND;. The name of the property |
| remains the same - <literal>jersey.config.client.httpUrlConnection.setMethodWorkaround</literal>. |
| </para></listitem> |
| <listitem><para> |
| <literal>ClientProperties.HTTP_URL_CONNECTOR_FIX_LENGTH_STREAMING</literal> |
| property (that |
| class as this property is specific to the connector instances created by |
| &lit.jersey.client.HttpUrlConnectorProvider; only. The property has been also renamed to |
| &jersey.client.HttpUrlConnectorProvider.USE_FIXED_LENGTH_STREAMING; and the new property name |
| is <literal>jersey.config.client.httpUrlConnector.useFixedLengthStreaming</literal>. |
| </para></listitem> |
| <listitem><para> |
| <literal>org.glassfish.jersey.grizzly.connector.GrizzlyConnector</literal> |
| has been removed from the public |
| API. &jersey.grizzly.GrizzlyConnectorProvider; should be used to produce Grizzly Asynchronous HTTP Client |
| connector instances instead. |
| </para></listitem> |
| <listitem><para> |
| Public constructor has been removed from the <literal>org.glassfish.jersey.apache.connector.ApacheConnector</literal>; API. |
| &jersey.apache.ApacheConnectorProvider; should be used to provide Apache HTTP Client |
| connector instances instead. |
| </para></listitem> |
| <listitem><para> |
| Public constructor has been removed from the <literal>org.glassfish.jersey.jetty.connector.JettyConnector</literal>; API. |
| &jersey.jetty.JettyConnectorProvider; should be used to provide Jetty HTTP Client |
| connector instances instead. |
| </para></listitem> |
| <listitem><para> |
| Renamed property <literal>CACHING_TEMPLATES_ENABLED</literal> in &jersey.server.mvc.MustacheMvcFeature; |
| from <literal>jersey.config.server.mvc.caching.mustache.enabled</literal> to |
| <literal>jersey.config.server.mvc.caching.mustache</literal>. |
| </para></listitem> |
| <listitem><para> |
| Authentication filters <literal>org.glassfish.jersey.client.filter.HttpBasicAuthFilter</literal> |
| and <literal>org.glassfish.jersey.client.filter.HttpDigestAuthFilter</literal> |
| were deprecated and replaced by &jersey.client.HttpAuthenticationFeature;. |
| </para></listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section xml:id="mig-2.5-other"> |
| <title>Other changes</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| The &jersey.server.ContainerLifecycleListener; invokes event |
| <literal>onStartup</literal> |
| and |
| <literal>onShutdown</literal> |
| also when application is being started or stopped because of application redeploy. The interface was |
| marked as a Beta now. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The monitoring statistics method |
| <literal>ApplicationStatistics.getDestroyTime()</literal> |
| is deprecated and returns always null. Use &jersey.server.ContainerLifecycleListener; to listen on |
| application destroy and get the destroy time. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.spi.ResponseExecutorsProvider</literal> |
| contract has been completely removed from the Jersey SPI as it was inconsistently used by Jersey |
| runtime and we did not find a suitable use case where a custom response executor would make sense. |
| While we have no indication that the removed SPI is used in the Jersey community, please do not |
| hesitate to contact us in case you think that you have a valid use case where the use of a custom |
| response executor makes sense. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>org.glassfish.jersey.spi.RequestsExecutorsProvider</literal> |
| contract has been renamed to |
| <literal>org.glassfish.jersey.spi.RequestsExecutorsProvider</literal>. It has been also extended with |
| an additional |
| <literal>releaseRequestingExecutor</literal> |
| method to address executor shutdown handling issues reported in <link |
| xlink:href='https://java.net/jira/browse/JERSEY-2205'>JERSEY-2205</link>. As such, any custom |
| implementation of the SPI is now required to implement the new method. (Note that the SPI has been |
| removed in Jersey 2.18 - see the Jersey 2.18 release migration guide section for more details.) |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| |
| </section> |
| |
| <section xml:id="mig-2.4.1"> |
| <title>Migrating from Jersey 2.4 to 2.4.1</title> |
| |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| The unsupported |
| <literal>ClientProperties.BUFFER_RESPONSE_ENTITY_ON_EXCEPTION</literal> |
| property, with value of <literal>jersey.config.client.bufferResponseEntityOnException</literal>, has been |
| removed from the API. Since Jersey 2.4 where |
| <link xlink:href='https://java.net/jira/browse/jersey-2157'>JERSEY-2157</link> |
| issue has been fixed, Jersey client runtime automatically buffers error response entities. This behavior |
| is automatic and there is no need to set any property. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| |
| <section xml:id="mig-2.4"> |
| <title>Migrating from Jersey 2.3 to 2.4</title> |
| |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| All deprecated SSE &jersey.sse.InboundEvent; |
| <literal>getData(...)</literal> |
| methods have been removed from the API. Use the new |
| <literal>readData(...)</literal> |
| methods have been introduced instead in Jersey 2.3 for consistency with other parts of client-side JAX-RS |
| API. Access to the raw SSE event data content is provided via a &lit.jersey.sse.InboundEvent;'s |
| <literal>byte[] getRawData()</literal> |
| method that has been introduced in Jersey 2.3 as well. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| All EJB and CDI integration classes have been moved into internal Jersey packages, to clearly state the |
| integration code should not be used as a public API. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| |
| <section xml:id="mig-2.3"> |
| <title>Migrating from Jersey 2.0, 2.1 or 2.2 to 2.3</title> |
| |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| All existing SSE &jersey.sse.InboundEvent; |
| <literal>getData(...)</literal> |
| methods have been made deprecated and new |
| <literal>readData(...)</literal> |
| methods have been introduced instead for consistency with other parts of client-side JAX-RS API. The |
| deprecated |
| <literal>getData(...)</literal> |
| methods will be removed in Jersey 2.4. A new SSE &jersey.sse.InboundEvent; |
| <literal>byte[] getRawData()</literal> |
| method has been introduced to provide access to the raw SSE event data content. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Generic &jersey.server.Broadcaster; methods for adding/removing &jersey.server.BroadcasterListener; |
| registrations have been renamed from |
| <literal>addBroadcasterListener/removeBroadcasterListener</literal> |
| to simply <literal>add/remove</literal>. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Generic &jersey.server.Broadcaster; (and transitively, &jersey.sse.SseBroadcaster;) |
| <literal>add/remove</literal> |
| methods - that are responsible for adding/removing &jersey.server.BroadcasterListener; |
| and &jersey.server.ChunkedOutput; (or &jersey.sse.EventOutput;) registrations - no longer try to avoid |
| duplicate registrations by comparing hash code of the added/removed instance with the hash codes of |
| already registered instances. This behavior has been identified as a potential source of hard to discover |
| bugs and was removed as such. The issue with the former behavior was that hash codes as integer values |
| provide only a very limited value space that could lead to false-positive duplicate registration |
| rejections, especially with larger number of simultaneously connected SSE clients (represented |
| by &lit.jersey.server.ChunkedOutput; or &lit.jersey.sse.EventOutput; broadcaster registrations). |
| Consequently, users who rely on the old registration behavior in their application code need to adapt the |
| code to the revised behavior of &lit.jersey.server.Broadcaster; |
| <literal>add/remove</literal> |
| methods. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| </section> |
| |
| <section xml:id="mig-1.x"> |
| <title>Migrating from Jersey 1.x to 2.0</title> |
| <para> |
| This chapter is a migration guide for people switching from Jersey 1.x. Since many of the Jersey 1.x features became |
| part of JAX-RS 2.0 standard which caused changes in the package names, we decided it is a good time to do a more |
| significant incompatible refactoring, which will allow us to introduce some more interesting new features in the |
| future. As the result, there are many incompatibilities between Jersey 1.x and Jersey 2.0. This chapter summarizes how |
| to migrate the concepts found in Jersey 1.x to Jersey/JAX-RS 2.0 concepts. |
| </para> |
| |
| <section xml:id="mig-server-api"> |
| <title>Server API</title> |
| <para> |
| Jersey 1.x contains number of proprietary server APIs. This section covers migration of application code relying |
| on those APIs. |
| </para> |
| |
| <section xml:id="mig-server-inject-custom-objects"> |
| <title>Injecting custom objects</title> |
| <para>Jersey 1.x have its own internal dependency injection framework which handles injecting various parameters |
| into field or methods. It also provides a way how to register custom injection provider in Singleton or |
| PerRequest scopes. Jersey 2.x uses HK2 as dependency injection framework and users are also able to register |
| custom classes or instances to be injected in various scopes. |
| </para> |
| |
| <para>Main difference in Jersey 2.x is that you don't need to create special classes or providers for this task; |
| everything should be achievable using HK2 API. Custom injectables can be registered at ResourceConfig level by |
| adding new HK2 Module or by dynamically adding binding almost anywhere using injected HK2 Services instance. |
| </para> |
| |
| <para>Jersey 1.x Singleton: |
| <programlisting language="java" linenumbering="unnumbered">ResourceConfig resourceConfig = new |
| DefaultResourceConfig(); resourceConfig.getSingletons().add( new SingletonTypeInjectableProvider<Context, |
| SingletonType>( SingletonType.class, new SingletonType()) {}); |
| </programlisting> |
| </para> |
| |
| <para>Jersey 1.x PerRequest: |
| <programlisting language="java" linenumbering="unnumbered">ResourceConfig resourceConfig = new |
| DefaultResourceConfig(); resourceConfig.getSingletons().add( new PerRequestTypeInjectableProvider<Context, |
| PerRequestType>() { @Override public Injectable<PerRequestType> getInjectable(ComponentContext |
| ic, Context context) { //... } }); |
| </programlisting> |
| </para> |
| |
| <para>Jersey 2.0 HK2 Module: |
| <programlisting language="java" linenumbering="unnumbered">public static class MyBinder extends AbstractBinder |
| { |
| |
| @Override protected void configure() { // request scope binding |
| bind(MyInjectablePerRequest.class).to(MyInjectablePerRequest.class).in(RequestScoped.class); // singleton |
| binding bind(MyInjectableSingleton.class).in(Singleton.class); // singleton instance binding bind(new |
| MyInjectableSingleton()).to(MyInjectableSingleton.class); } |
| |
| } |
| |
| // register module to ResourceConfig (can be done also in constructor) ResourceConfig rc = new |
| ResourceConfig(); rc.addClasses(/* ... */); rc.addBinders(new MyBinder()); |
| </programlisting> |
| </para> |
| |
| <para>Jersey 2.0 dynamic binding: |
| <programlisting language="java" linenumbering="unnumbered">public static class MyApplication extends |
| Application { |
| |
| @Inject public MyApplication(ServiceLocator serviceLocator) { System.out.println("Registering |
| injectables..."); |
| |
| DynamicConfiguration dc = Injections.getConfiguration(serviceLocator); |
| |
| // request scope binding Injections.addBinding( |
| Injections.newBinder(MyInjectablePerRequest.class).to(MyInjectablePerRequest.class).in(RequestScoped.class), |
| dc); |
| |
| // singleton binding Injections.addBinding( Injections.newBinder(MyInjectableSingleton.class) |
| .to(MyInjectableSingleton.class) .in(Singleton.class), dc); |
| |
| // singleton instance binding Injections.addBinding( Injections.newBinder(new MyInjectableSingleton()) |
| .to(MyInjectableSingleton.class), dc); |
| |
| // request scope binding with specified custom annotation Injections.addBinding( |
| Injections.newBinder(MyInjectablePerRequest.class) .to(MyInjectablePerRequest.class) .qualifiedBy(new |
| MyAnnotationImpl()) .in(RequestScoped.class), dc); |
| |
| // commits changes dc.commit(); } |
| |
| @Override public Set<Class<?>> getClasses() { return ... }} |
| </programlisting> |
| </para> |
| </section> |
| |
| <section xml:id="mig-server-reload"> |
| |
| <title>ResourceConfig Reload</title> |
| |
| <para> |
| In Jersey 1, the reload functionality is based on two interfaces: |
| <orderedlist> |
| <listitem> |
| <simpara>com.sun.jersey.spi.container.ContainerListener</simpara> |
| </listitem> |
| <listitem> |
| <simpara>com.sun.jersey.spi.container.ContainerNotifier</simpara> |
| </listitem> |
| </orderedlist> |
| |
| Containers, which support the reload functionality implement the |
| <literal>ContainerListener</literal> |
| interface, so that once you get access to the actual container instance, you could call its |
| <literal>onReload</literal> |
| method and get the container re-load the config. The second interface helps you to obtain the actual container |
| instance reference. An example on how things are wired together follows. |
| |
| <example> |
| <title>Jersey 1 reloader implementation</title> |
| <programlisting language="java" linenumbering="numbered">public class Reloader implements |
| ContainerNotifier { List<ContainerListener> ls; |
| |
| public Reloader() { ls = new ArrayList<ContainerListener>(); } |
| |
| public void addListener(ContainerListener l) { ls.add(l); } |
| |
| public void reload() { for (ContainerListener l : ls) { l.onReload(); } } } |
| </programlisting> |
| </example> |
| |
| <example> |
| <title>Jersey 1 reloader registration</title> |
| <programlisting language="java" linenumbering="numbered">Reloader reloader = new Reloader(); |
| resourceConfig.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_NOTIFIER, reloader); |
| </programlisting> |
| </example> |
| |
| In Jersey 2, two interfaces are involved again, but these have been re-designed. |
| |
| <orderedlist> |
| <listitem> |
| <simpara>org.glassfish.jersey.server.spi.Container</simpara> |
| </listitem> |
| <listitem> |
| <simpara>org.glassfish.jersey.server.spi.ContainerLifecycleListener</simpara> |
| </listitem> |
| </orderedlist> |
| |
| The |
| <literal>Container</literal> |
| interface introduces two |
| <literal>reload</literal> |
| methods, which you can call to get the application re-loaded. One of these methods allows to pass in a |
| new &lit.jersey.server.ResourceConfig; instance. |
| |
| You can register your implementation of |
| <literal>ContainerLifecycleListener</literal> |
| the same way as any other provider (i.e. either by annotating it by &jaxrs.ext.Provider; annotation or adding |
| it to the Jersey &jersey.server.ResourceConfig; directly either using the class (using |
| <literal>ResourceConfig.addClasses()</literal>) or registering a particular instance using |
| <literal>ResourceConfig.addSingletons()</literal> |
| method. |
| </para> |
| |
| <para> |
| An example on how things work in Jersey 2 follows. |
| |
| <example> |
| <title>Jersey 2 reloader implementation</title> |
| <programlisting language="java" linenumbering="numbered">public class Reloader implements |
| ContainerLifecycleListener { |
| |
| Container container; |
| |
| public void reload(ResourceConfig newConfig) { container.reload(newConfig); } |
| |
| public void reload() { container.reload(); } |
| |
| @Override public void onStartup(Container container) { this.container = container; } |
| |
| @Override public void onReload(Container container) { // ignore or do whatever you want after reload |
| has been done } |
| |
| @Override public void onShutdown(Container container) { // ignore or do something after the container |
| has been shutdown } } |
| </programlisting> |
| </example> |
| <example> |
| <title>Jersey 2 reloader registration</title> |
| <programlisting language="java" linenumbering="numbered">Reloader reloader = new Reloader(); |
| resourceConfig.addSingletons(reloader); |
| </programlisting> |
| </example> |
| </para> |
| </section> |
| |
| <section xml:id="mig-server-provider-ordering"> |
| <title>MessageBodyReaders and MessageBodyWriters ordering</title> |
| <para>JAX-RS 2.0 defines new order of MessageBodyWorkers - whole set is sorted by declaration distance, media type |
| and source (custom providers having higher priority than default ones provided by Jersey). JAX-RS 1.x ordering |
| can still be forced by setting parameter |
| <literal>MessageProperties.LEGACY_WORKERS_ORDERING</literal> |
| (<literal>"jersey.config.workers.legacyOrdering"</literal>) to &lit.true; |
| in &lit.jersey.server.ResourceConfig; or &lit.jersey.client.ClientConfig; properties. |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-client-api"> |
| <title>Migrating Jersey Client API</title> |
| |
| <para> |
| JAX-RS 2.0 provides functionality that is equivalent to the Jersey 1.x proprietary client API. Here is a rough |
| mapping between the Jersey 1.x and JAX-RS 2.0 Client API classes: |
| </para> |
| <table frame='all'> |
| <title>Mapping of Jersey 1.x to JAX-RS 2.0 client classes</title> |
| <tgroup cols='3' align='left' colsep='1' rowsep='1'> |
| <colspec colname='c1' colwidth="0*"/> |
| <colspec colname='c2' colwidth="0*"/> |
| <colspec colname='c3' colwidth="1*"/> |
| <thead> |
| <row> |
| <entry>Jersey 1.x Class</entry> |
| <entry>JAX-RS 2.0 Class</entry> |
| <entry>Notes</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry> |
| <link xlink:href="http://jersey.java.net/nonav/apidocs/1.17/jersey/com/sun/jersey/api/client/Client.html"> |
| com.sun.jersey.api.client.Client |
| </link> |
| </entry> |
| <entry> |
| &jaxrs.client.ClientBuilder; |
| </entry> |
| <entry>For the static factory methods and constructors.</entry> |
| </row> |
| <row> |
| <entry/> |
| <entry> |
| &jaxrs.client.Client; |
| </entry> |
| <entry>For the instance methods.</entry> |
| </row> |
| <row> |
| <entry> |
| <link xlink:href="http://jersey.java.net/nonav/apidocs/1.17/jersey/com/sun/jersey/api/client/WebResource.html"> |
| com.sun.jersey.api.client.WebResource |
| </link> |
| </entry> |
| <entry> |
| &jaxrs.client.WebTarget; |
| </entry> |
| <entry/> |
| </row> |
| <row> |
| <entry> |
| <link xlink:href="http://jersey.java.net/nonav/apidocs/1.17/jersey/com/sun/jersey/api/client/AsyncWebResource.html"> |
| com.sun.jersey.api.client.AsyncWebResource |
| </link> |
| </entry> |
| <entry> |
| &jaxrs.client.WebTarget; |
| </entry> |
| <entry>You can access async versions of the async methods by calling |
| <literal>WebTarget.request().async()</literal> |
| </entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| |
| <para>The following sub-sections show code examples.</para> |
| |
| <section xml:id="mig-client-simple-request"> |
| <title>Making a simple client request</title> |
| <para> |
| Jersey 1.x way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = Client.create(); WebResource |
| webResource = client.resource(restURL).path("myresource/{param}"); String result = |
| webResource.pathParam("param", "value").get(String.class); |
| </programlisting> |
| </para> |
| |
| <para> |
| JAX-RS 2.0 way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = ClientBuilder.newClient(); |
| WebTarget target = client.target(restURL).path("myresource/{param}"); String result = |
| target.pathParam("param", "value").get(String.class); |
| </programlisting> |
| </para> |
| </section> |
| |
| <section xml:id="mig-client-filter-register"> |
| <title>Registering filters</title> |
| |
| <para> |
| Jersey 1.x way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = Client.create(); WebResource |
| webResource = client.resource(restURL); webResource.addFilter(new HTTPBasicAuthFilter(username, |
| password)); |
| </programlisting> |
| </para> |
| |
| <para> |
| JAX-RS 2.0 way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = ClientBuilder.newClient(); |
| WebTarget target = client.target(restURL); target.register(new HttpBasicAuthFilter(username, password)); |
| </programlisting> |
| </para> |
| </section> |
| |
| <section xml:id="mig-client-accept-header"> |
| <title>Setting "Accept" header</title> |
| |
| <para> |
| Jersey 1.x way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = Client.create(); WebResource |
| webResource = client.resource(restURL).accept("text/plain"); ClientResponse response = |
| webResource.get(ClientResponse.class); |
| </programlisting> |
| </para> |
| |
| <para> |
| JAX-RS 2.0 way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = ClientBuilder.newClient(); |
| WebTarget target = client.target(restURL); Response response = target.request("text/plain").get(); |
| </programlisting> |
| </para> |
| </section> |
| |
| <section xml:id="mig-client-add-entity"> |
| <title>Attaching entity to request</title> |
| <para> |
| Jersey 1.x way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = Client.create(); WebResource |
| webResource = client.resource(restURL); ClientResponse response = webResource.post(ClientResponse.class, |
| "payload"); |
| </programlisting> |
| </para> |
| |
| <para> |
| JAX-RS 2.0 way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = ClientBuilder.newClient(); |
| WebTarget target = client.target(restURL); Response response = |
| target.request().post(Entity.text("payload")); |
| </programlisting> |
| </para> |
| </section> |
| |
| <section xml:id="mig-client-ssl"> |
| <title>Setting SSLContext and/or HostnameVerifier</title> |
| |
| <para> |
| Jersey 1.x way: |
| |
| <programlisting language="java" linenumbering="unnumbered">HTTPSProperties prop = new |
| HTTPSProperties(hostnameVerifier, sslContext); DefaultClientConfig dcc = new DefaultClientConfig(); |
| dcc.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, prop); Client client = |
| Client.create(dcc); |
| </programlisting> |
| </para> |
| |
| <para> |
| Jersey 2.0 way: |
| |
| <programlisting language="java" linenumbering="unnumbered">Client client = ClientBuilder.newBuilder() |
| .sslContext(sslContext) .hostnameVerifier(hostnameVerifier) .build(); |
| </programlisting> |
| </para> |
| </section> |
| </section> |
| |
| <section xml:id="mig-1-x-json"> |
| <title>JSON support changes</title> |
| <para>JSON Support has undergone certain changes in Jersey 2.x. The most visible difference for the developer is |
| in the initialization and configuration. |
| </para> |
| <para> |
| In Jersey 1.x, the JAXB/JSON Support was implemented as a set of |
| <literal>MessageBodyReaders</literal> |
| and |
| <literal>MessageWriters</literal> |
| in the |
| <literal>jersey-json</literal> |
| module. Internally, there were several implementations of JSON to Object mapping ranging from Jersey's own custom |
| solution to third party providers, such as |
| <literal>Jackson</literal> |
| or<literal>Jettison</literal>. The configuration of the JSON support was centralized in the |
| <literal>JSONConfiguration</literal> |
| and |
| <literal>JSONJAXBContext</literal> |
| classes. |
| </para> |
| <section xml:id="mig-1-x-json-init"> |
| <title>Initialization</title> |
| <para> |
| There are three main JSON-mapping handling approaches, which are preserved in Jersey 2: |
| <link linkend="json-jaxb">JAXB-based</link>, |
| <link linkend="json-pojo">POJO mapping</link> |
| and |
| <link linkend="json-lowlevel">Low-level parsing</link> |
| |
| The following table shows how to enable each of them in both Jersey 2 compared to Jersey 1: |
| <table> |
| <title>JSON approaches and usage in Jersey 1 vs Jersey 2</title> |
| <tgroup cols="3"> |
| <thead> |
| <row> |
| <entry>Approach</entry> |
| <entry>Jersey 1</entry> |
| <entry>Jersey 2</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>POJO</entry> |
| <entry>register<literal>POJOMappingFeature</literal>, use &jersey.media.ObjectMapper1; for |
| configuration |
| </entry> |
| <entry> |
| use |
| <literal>Jackson</literal> |
| provider: (add |
| <literal>jersey-media-json-jackson</literal> |
| dependency and |
| <link linkend="jackson-registration">register</link> |
| the<literal>JacksonFeature</literal>), configure with custom &jersey.media.ObjectMapper; |
| instance. |
| </entry> |
| </row> |
| <row> |
| <entry>JAXB</entry> |
| <entry>Default; use<literal>JSONConfiguration</literal>/ |
| <literal>JSONJAXBContext</literal> |
| for configuration |
| </entry> |
| <entry>use |
| <literal>MOXy</literal> |
| (add the |
| <literal>jersey-media-moxy</literal> |
| dependency; the feature will be registered |
| <link linkend="deployment.autodiscoverable">automatically</link>), configure using |
| <literal>MoxyJsonConfig</literal> |
| </entry> |
| </row> |
| <row> |
| <entry>Low-level</entry> |
| <entry>Direct usage of |
| <literal>JSONObject</literal> |
| and/or |
| <literal>JSONArray</literal> |
| classes |
| </entry> |
| <entry>use JSON-P (standard) or Jettison (non-standard) APIs (add the relevant dependency) |
| </entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| <example> |
| <title>Initializing JAXB-based support with MOXy</title> |
| <programlisting language="xml" linenumbering="unnumbered"> |
| <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> |
| <version>&version;</version> </dependency></programlisting> |
| </example> |
| <note> |
| <para> |
| For JAXB-based support, MOXy is the default way in Jersey 2. However, other providers (<literal> |
| Jackson</literal>,<literal>Jettison</literal>) can be used as well. The relevant feature has to be |
| registered (and dependency added) and custom implementation of |
| <literal>ContextResolver</literal> |
| has to be provided. See the code snippets in the <link linkend="json.jackson">related chapter</link>. |
| </para> |
| <para> |
| For more on particular |
| <literal>Feature</literal> |
| registration, see also: |
| <link linkend="jackson-registration">Jackson registration</link>, |
| <link linkend="jettison-registration">Jettison registration</link>, |
| <link linkend="moxy-registration">MOXy registration</link>, |
| <link linkend="jsonp-registration">JSON-P registration</link>. |
| </para> |
| <para> |
| It is important to point out, that the |
| <literal>Feature</literal> |
| registration has to be done separately for client and server. |
| </para> |
| </note> |
| <note> |
| <para> |
| With Jersey 2.9, |
| <literal>Jackson</literal> |
| has been updated to version 2.3.2. The feature is still configured via mentioned |
| <literal>ObjectMapper</literal> |
| class, but the package has changed. |
| <itemizedlist> |
| <listitem>For<literal>jackson 1.x</literal>, use |
| <literal>org.codehaus.jackson.map.ObjectMapper</literal> |
| </listitem> |
| <listitem>For<literal>jackson 2.x</literal>, use |
| <literal>com.fasterxml.jackson.core.ObjectMapper</literal> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </note> |
| </para> |
| </section> |
| <section xml:id="mig-1-x-json-notation"> |
| <title>JSON Notation</title> |
| <para> |
| Jersey 1 was selecting the provider automatically based on the desired JSON Notation. This concept was |
| replaced in Jersey 2 by direct choice of provider (as shown above). To provide some guide how to achieve |
| the same results as in the previous Jersey version, see the following list: |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>MAPPED</literal> |
| not supported |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>NATURAL</literal> |
| default MOXy output |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>JETTISON_MAPPED</literal> |
| supported by Jettison |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>BADGERFISH</literal> |
| supported by Jettison |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </section> |
| <section xml:id="mig-1-x-json-config"> |
| <title>Configuration</title> |
| <para> |
| As mentioned, the centralized configuration of Jersey 1's |
| <literal>JSONConfiguration</literal> |
| does not have a direct equivalent in Jersey 2. Each provider has its own way to be configured. Detailed |
| description of each method and property is out of scope of this migration guide and can be found in the |
| documentation and APIs of the relevant providers and/or the relevant Jersey module API. Bellow are several |
| basic examples how to configure certain options when using MOXy with Jersey's |
| <literal>MoxyJsonConfig</literal> |
| class. |
| |
| <itemizedlist> |
| <listitem> |
| <para> |
| <emphasis>Formated output</emphasis> |
| </para> |
| <para>Jersey 1: |
| <literal>JSONConfiguration.createJSONConfigurationWithFormatted()</literal> |
| </para> |
| <para>Jersey 2/MOXy: |
| <literal>MoxyJsonConfig.setFormattedOutput()</literal> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <emphasis>Namespaces mapping</emphasis> |
| </para> |
| <para>Jersey 1: |
| <literal>JSONConfiguration.natural().xml2JsonNs()</literal> |
| </para> |
| <para>Jersey 2/MOXy: |
| <literal>MoxyJsonConfig.setNamespacePrefixMapper()</literal> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <emphasis>Namespace separator</emphasis> |
| </para> |
| <para>Jersey 1: |
| <literal>JSONConfiguration.natural().nsSeparator()</literal> |
| </para> |
| <para>Jersey 2/MOXy: |
| <literal>MoxyJsonConfig.setNamespaceSeparator()</literal> |
| </para> |
| </listitem> |
| </itemizedlist> |
| |
| Properties can be also passed directly to |
| <literal>Marshaller</literal> |
| and/or |
| <literal>Unmarshaller</literal> |
| using: <literal>MoxyJsonConfig</literal>'s <literal>property()</literal>, |
| <literal>marshallerProperty()</literal> |
| and |
| <literal>unmarshallerProperty()</literal> |
| methods. |
| </para> |
| </section> |
| <para> |
| More on the JSON Support topic can be found in <xref linkend="json"/>. |
| </para> |
| </section> |
| </section> |
| </chapter> |