Environment
Wicket 8.0 requires at least Java 8
Wicket 8.0 requires Servlet 3.1 (Jetty 9.2+, Apache Tomcat 8+, JBoss WildFly 10+)
API changes
Deprecate org.apache.wicket.util.IProvider
Replace it with standard Java 8 java.util.function.Supplier<T> which is virtually identical.
Deprecate org.apache.wicket.util.IContextProvider
Replace IContextProvider<T, C> with standard Java 8 java.util.function.Function<C, T> which is virtually identical.
As a consequence IPageManagerProvider, IPageRendererProvider and IRequestCycleProvider now override #apply() method instead of #get().
Deprecate org.apache.wicket.protocol.http.documentvalidation.HtmlDocumentValidator
Tests based on HtmlDocumentValidator are very fragile. They start to fail as soon as there is a single character change somewhere in the page markup.
We believe that there are very few users of this API. It is recommended to use TagTester and WicketTestCase#executeTest() instead.
IGenericComponent's setter methods now return the current instance for method chaining
All specialization classes return their type.
AjaxButton, AjaxLink and AjaxFallbackButton event callback methods no longer get form as second argument
For consistency with other components and the new lambda support, the submitted form is no longer passed as argument to callback methods (e.g. #onSubmit(), #onClick()) of AjaxButton, AjaxLink and AjaxFallbackButton. You can call #getForm() instead.
RequestCycle#find(Class<T>) returns java.util.Optional
Code calling RequestCycle#find(Class<T>) has to check whether a matching IRequestHandler is found. This is now enforced by returning an Optional<T>:
Silent API break
During migration you should check your old code for places where the AjaxRequestCycle (now an Optional<AjaxRequestTarget>) is compared with null:
AjaxFallback** components now use java.util.Optional
All AjaxFallback** components and the containers which use internally AjaxFallback** components, like AjaxTabbedPanel, RatingPanel and TableTree, have been reworked to pass Optional<AjaxRequestTarget> instead of just AjaxRequestTarget to their onXyz() callback methods. This way the application developer should not forget to check that the AjaxRequestTarget is not null.
AbstractChoice#getChoices() is 'final' now
AbstractChoice#getChoices() has been made final. If the application needs to provide different choices for each render then it should override AbstractChoice#getChoicesModel() instead. The application code would be almost the same as before, it will just need to wrap the final List result in an IModel, most probably ListModel.
ListenerInterfaceRequestHandler simplification
RequestListenerInterface was removed: IResourceListener, IBehaviorListener, IOnChangeListener, ILinkListener are replaced by the generic method IRequestListener#onRequest().
A Component or Behavior can now implement IRequestListener once only, thus removing the need to include an identifier (e.g. "ILinkListener") in the URL.
Behavior changes
FormComponentPanel delegates the call to #clearInput to its FormComponent children
FormComponent#clearInput() has been made non-final, so that now containers like FormComponentPanel could override this method and call #clearInput() on its children of type FormComponent.
Use DynamicJQueryResourceReference by default
By using org.apache.wicket.resource.DynamicJQueryResourceReference Wicket will contribute jQuery ver. 2.x for modern browsers and ver. 1.x when the request is done by Internet Explorer older than ver. 9.
Removals
Drop Jetty 7.x and 9.0.x modules for Wicket Native WebSocket
Since Wicket 8.x requires Servlet 3.1 the modules for native websocket support for Jetty 7.x/9.0.x have been dropped.
Users are advised to use wicket-native-websocket-javax module with Jetty 9.2+, Apache Tomcat 7/8, JBoss WildFly.
Remove deprecated classes
Several deprecated classes where removed:
- IMountedRequestMapper and implementation
- ZeroPaddingIntegerConverter
- WildcardCollectionModel, WildcardListModel, WildcardSetModel - use the corresponding classes without "Wildcard"-prefix instead
Improvements
IModel uses Java 8 default interface method for IDetachable#detach()
For convenience IModel class provides a do-nothing implementation of IDetachable#detach() method, so custom implementations are not required to implement it when not needed.
IRequestHandler uses Java 8 default interface method for IRequestHandler#detach()
For convenience IRequestHandler class provides a do-nothing implementation of its #detach() method, so custom implementations are not required to implement it when not needed.
ResourceStreamResource now receives Attributes as a parameter to its #getResourceStream() method
For access to the response, the request and its parameters now ResourceStreamResource#getResourceStream() receives an instance of org.apache.wicket.request.resource.IResource.Attributes.
Provide serializable versions of java.util.function.(Supplier|Consumer|Function|BiConsumer)
java.util.function.Consumer and other classes are not serializable and this makes them unusable in stateful Wicket pages. For this reason Wicket provides org.apache.wicket.model.lambda.WicketSupplier, org.apache.wicket.model.lambda.WicketConsumer, org.apache.wicket.model.lambda.WicketFunction and org.apache.wicket.model.lambda.WicketBiFunction. Those interfaces should be used in method signatures where Java 8 lambdas or method references could be used. At the call site there is nothing specific to be done, i.e. just use lambdas and method references without any casting.
Provide IModel implementations which make use of Java 8 lambdas and method references
Wicket provides a new implementation of IModel which uses Java 8 consumers and suppliers, i.e. may be used with lambda or method references
org.apache.wicket.model.LambdaModel
org.apache.wicket.model.LambdaModel with method references
org.apache.wicket.model.LambdaModel can be created with a target model too - note the upper-case 'P' for the function references:
IGenericComponent is a mixin/trait interface
IGenericComponent uses Java 8 default methods to implement #setModel(IModel<T>), #getModel(), #setModelObject(T) and #getModelObject() by delegating to the respective get/setDefaultModel[Object] methods.
This way it could be easily used by any Component by just implementing it.
IModel is a @FunctionalInterface now
IModel provides default implementations of #detach() (do nothing) and #setObject(T) (throws UnsupportedOperationException), so it is possible to use it as a functional interface.
Provide LambdaColumn - IColumn implementation that uses java.util.function.Function
IColumn uses Java 8 default interface method for IColumn#isSortable() Git commit
For convenience IColumn class provides an implementation of #isSortable() method that uses #getSortProperty() to decide. Just like AbstractColumn did until Wicket 7.
IColumn provides methods for column's header rowspan/colspan
New methods have been added to help manipulating the tables' headers: IColumn#getHeaderColspan() and IColumn#getHeaderRowSpan(). Both of them return 1, so the header cells do not span by default.
IRequestCycleListener notified of all IRequestHandlers
IRequestCycleListeners are now notified of the execution of all IRequestHandlers, including those scheduled by other handlers, those replacing other handlers, and any handler executed due to an exception:
- #onRequestHandlerResolved(RequestCycle, IRequestHandler) - any handler to be executed
- #onRequestHandlerExecuted(RequestCycle, IRequestHandler) - any handler successfully executed without an exception
RequestHandlerStack is now renamed to RequestHandlerExecutor.
Dependency updates
All libraries on which Wicket modules depend are updated to their latest stable versions.
The most notable ones are:
- Spring Framework 4.2.x
- Jetty 9.3.x (used in the Quickstart application archetype and for internal Wicket testing)