You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 55 Next »

Migrating to Wicket 7.0

Environment

Wicket 7.0 requires at least Java 7

Wicket 7.0 requires Servlet 3.0

The HTTP response is not flushed automatically when the request is started in asynchronous mode. WICKET-5152

This is an improvement in Wicket 7.0 which should not affect any application migrating from Wicket 6.x. But if you use Servlet 3.0's AsyncContext in IResource in Wicket 7 then make sure that your code flushes the http response after completing the request.

API changes

org/apache/wicket/core/util/io/SerializableChecker is replaced with org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream WICKET-4817

CheckingObjectOutputStream accepts a list of org.apache.wicket.core.util.objects.checker.IObjectChecker objects which are used to check for different kind of problems during object serialization. Commit diff: d0441059e0

org/apache/wicket/markup/html/border/BoxBorder is removed with no replacement WICKET-4966.

BoxBorder class has been deprecated in Wicket 6.x series

org.apache.wicket.Component#renderHead(HtmlHeaderContainer) is renamed to Component#internalRenderHead(HtmlHeaderContainer) WICKET-4964

Component#renderHead(HtmlHeaderContainer) was very similar to the usually used Component#renderHead(IHeaderResponse). So it has been renamed to avoid any confusions.

org.apache.wicket.request.resource.ResourceReference#getDependencies() now returns a mutable List<HeaderItem> WICKET-5124

The old API returned Iterable<? extends HeaderItem> and was inconvenient to override and add additional dependencies.
With the new API it is as easy as:

MyResourceReference.java
@Override
public List<HeaderItem> getDependencies() {
  List<HeaderItem> dependencies = super.getDependencies();
  dependencies.add(dep1);
  dependencies.add(dep2);
  return dependencies;
}

The same is done for org.apache.wicket.markup.head.HeaderItem#getDependencies() too.

org.apache.wicket.model.StringResourceModel constructor accepts IModel<String> for its default value WICKET-4972

There were two problems with the old way:

  • since the parameters argument type is Object..., i.e. varargs, it was hard for the compiler and runtime to differentiate the "defaultValue" from the "parameters"
  • it wasn't possible to use lazy evaluation of the default value

If in your application you have code like:

MyComponent.java
StringResourceModel model = new StringResourceModel(resourceKey, model, "Some default value", new Object[] [param1, param2]);

then the simplest solution is to use Model.of("Some default value"):

MyComponent.java
StringResourceModel model = new StringResourceModel(resourceKey, model, Model.of("Some default value"), new Object[] [param1, param2]);
org.apache.wicket.extensions.validation.validator.+Xyz+Validator#decorate() now works with IValidationError WICKET-5174

This method now accepts IValidationError as an argument and returns IValidationError. This way it can be used with other IValidationError implementations like RawValidationError for example.

org.apache.wicket.ajax.attributes.AjaxRequestAttributes#setAllowDefault is renamed to #setPreventDefault WICKET-5197

This is done to make it more consistent with JavaScript API.

org.apache.wicket.ajax.attributes.AjaxRequestAttributes#eventPropagation is now BUBBLE by default WICKET-5198

This is done to make it more consistent with JavaScript API.

org.apache.wicket.ajax.form.AjaxFormValidatingBehavior doesn't use static methods anymore WICKET-5196

To use AjaxFormValidatingBehavior in Wicket 6.x the application code should do something like:

MyComponent.java
AjaxFormValidatingBehavior.addToAllFormComponents(form, "keydown", Duration.ONE_SECOND);

Due to the usage of static method it wasn't possible to extend this behavior and override for example #updateAjaxAttributes(AjaxRequestAttributes).

The behavior has been reworked a bit to allow this. The new usage is:

MyComponent.java
form.add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND);

or

MyComponent.java
formComponent.add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND);

in this case the formComponent's owning Form will be used.

org.apache.wicket.ajax.AjaxRequestTarget.IListener#updateAjaxAttributes() is introduced WICKET-5212

With WICKET-4958 has been introduced org.apache.wicket.ajax.AjaxRequestTarget.AbstractListener which is an empty implementation of AjaxRequestTarget.IListener to be able to introduce AbstractListener#updateAjaxAttributes() method - a place where an application can configure globally the Ajax attributes. With WICKET-5212 this new method is moved to the interface as well.
From now on it is recommended all implementations of AjaxRequestTarget.IListener to extend from AjaxRequestTarget.AbstractListener. This way they won't need to a implement another method when a new one is added in a major release.

org.apache.wicket.ISessionListener#onUnbound(String) is added WICKET-5213

This way all registered ISessionListeners will be notified when a Session is unbound.

(Base)WicketTester uses org.junit.Assert instead of junit.framework.Assert

junit.framework.Assert is deprecated. Due to this change org.junit.Assert#fail() throws now java.lang.AssertionError instead of junit.framework.AseertionFailedError

(Base)WicketTester can be reused after thrown exception

If an exception is thrown during processing in BaseWicketTester or the request was not processed by Wicket, you have to use #getLastRequest() to access this request (was #getRequest() previously).
WICKET-5389.

org.apache.wicket.Component#setMetaData() value could be only a Serializable WICKET-5227

Component and Session's meta data must be serializable.

org.apache.wicket.Application#getHeaderContributorListenerCollection() is renamed to #getHeaderContributorListeners()

This way it is consistent with the other #getXyzListeners() methods in Application class

org.apache.wicket.authorization.IAuthorizationStrategy#isResourceAuthorized(IResource, PageParameters) is introduced WICKET-5012

Wicket 7.x supports authorization for requests to resources (IResource) additionally to authorization for components.

org.apache.wicket.Component#setResponsePage() now accepts org.apache.wicket.request.component.IRequestablePage instead of org.apache.wicket.Page

org.apache.wicket.Component#setResponsePage(page) just delegates to org.apache.wicket.request.cycle.RequestCycle#setResponsePage() that required just IRequestablePage.

AutoCompleteTextField doesn't support useHideShowCoveredIEFix setting WICKET-5130

useHideShowCoveredIEFix setting was needed for IE7 support. This version of IE is not supported officially anymore and this setting has been removed.

org.apache.wicket.markup.html.form.TextField#getInputType() returns String array WICKET-5286

org.apache.wicket.extensions.markup.html.form.DateTextField can be used with several date-like types: date, datetime, datetime-local, month, time, week.
To be able to support this the return type of TextField#getInputType() has been changed from String to String[], and the method itself has been renamed to #getInputTypes().

To migrate it you should do something like:

OldMyTextField.java
...
@Override
protected String getInputType()
{
	return "sometype";
}
...

to

NewMyTextField.java
...
@Override
protected String[] getInputTypes()
{
	return new String[] { "sometype" };
}
...
AuthenticatedWebSession#authenticate is now protected instead of public. WICKET-5308

No change in user code is required, but the authenticate method can now be made protected to avoid confusion with the signIn method.

AbstractResource.ResourceResponse API became more fluent. WICKET-5330

All setter methods in AbstractResource.ResourceResponse class now will return this instance for method chaining.

org.apache.wicket.markup.head.IHeaderItemWrapper is merged to IWrappedHeaderItem. WICKET-5366

IHeaderItemWrapper was a temporary class used to add a new method (#wrap(HeaderItem)) without breaking the APIs in Wicket 6.x.
The new method is moved its proper class - IWrappedHeaderItem.

All 'QuirkXyz' properties has been removed from org.apache.wicket.protocol.http.ClientProperties WICKET-5370

The 'quirk' properties were mostly related to IE6/7 and old versions of Firefox browsers.

org.apache.wicket.request.resource.AbstractResource#flushResponseAfterHeaders() is removed WICKET-5392

This method was needed as a workaround for some old version of Firefox that had an issue with rendering images.
The flush of the headers caused problems with proper buffering of the response, e.g. when the response needs to be compressed.

All IXyzSettings are removed WICKET-5410

All interfaces related to configuration settings have been removed because the user application usually call setter methods like application.getXyzSettings().setAbc(abc) and don't provide their own implementations of these interfaces.
Additionally by using interfaces it is not possible to add new settings in a minor release of Wicket because it is considered as an API break.

To fix any compilation issues just remove the leading I from the class name, e.g. IMarkupSettings -> MarkupSettings, and optimize the imports in your IDE.

Behavior changes

org.apache.wicket.request.Url#getQueryString WICKET-4664

Url#getQueryString() now behaves as HttpServletRequest behaves :

  • returns the query string without the leading "?"
  • returns null when there is no query string

RequestUtils#decodeParameters() now strips the "?" from the output value.

org.apache.wicket.request.http.WebResponse encodes the value of the "filename" in Content-Disposition header WICKET-4934

The value of the file name used in "Content-Disposition" response header can contain characters which should be encoded

org.apache.wicket.markup.html.form.FormComponentLabel outputs "required", "disabled" and "error" classes when its form component is either required, disabled or invalid. WICKET-5177

This way it is in sync with AutoLabel (the auto component that is used for "wicket:for" attribute).

org.apache.wicket.markup.html.panel.FeedbackPanel Do not set CSS class on the li > span element for a feedback message WICKET-4831

The css class is now only applied to the li element and not to the span inside. Additionally a FeedbackPanel#newMessageItem() method has been added to allow customization of each feedback message item (similar to DataTable#newRowItem()).

AjaxEventBehavior doesn't prevent the default behavior of the JavaScript event WICKET-5197

From now on only AjaxFallback** components prevent the default JavaScript event behavior so only the Ajax call is made when JavaScript is enabled in the browser.
If the default behavior should be prevented in any use case then use:

attributes.setPreventDefault(true);
Ajax behaviors let JavaScript events bubble by default WICKET-5198

If JavaScript events should not bubble then use:

attributes.setEventPropagation(EventPropagation.STOP);

or:

attributes.setEventPropagation(EventPropagation.STOP_IMMEDIATE);
PackageTextTemplate loads its content lazily WICKET-4579

PackageTextTemplate will load its content at first usage of PackageTextTemplate#toString() or PackageTextTemplate#interpolate(Map) methods.
If its style/locale/variation/encoding are changed then it will reload its content.

AbstractLink no longer alters its markup to render itself as disabled WICKET-4904

The href and disabled attributes are still added/removed by AbstractLink as required. But no further mangling of markup is performed. org.apache.wicket.markup.html.link.DisabledLinkBehavior can be used to restore the pre-Wicket-7.x representation of disabled links with <em><span></span></em> (note that <em> and <span> swap their position though). If the old behavior is need it can be easily re-applied by using org.apache.wicket.markup.html.link.DisabledLinkBehavior.LinkInstantiationListener.

Button no longer silently ignores exceptions WICKET-5235

... when it renders its model into the value attribute.

Deprecated classes/methods/fields are removed WICKET-5201

AbstractDefaultAjaxBehavior's #getSuccessHandler(), #getFailureHandler(), #getChannel() and #getPrecondition() are removed.

They were deprecated since 6.0.0 and were there only for backward compatibility. Use #updateAjaxAttributes() to configure the same functionalities.

The old Tree component in wicket-extensions is removed.

It was based on Swing APIs and many people complained about this. Use the new Tree component introduced in Wicket 6.0.0 instead.

Wicket.Window.unloadConfirmation has been removed WICKET-5246

In Wicket 6 a new setting has been added to ModalWindow - org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow#showUnloadConfirmation(). In Wicket 7 the new Java API should be used instead of dealing with the JavaScript property Wicket.Window.unloadConfirmation.

AllVisitFilter has been removed.

Use IVisitFilter.ANY instead.

Label constructor with String argument has been removed WICKET-5201

Use Serializable argument instead.

RangeValidator deprecated keys removed

Use RangeValidator.* instead of MinimumValidator and MaximumValidator.

InlineFrame uses IPageProvider WICKET-5347

IPageLink has been scheduled for removal because it was superseded by IPageProvider. Its last usage has been removed from InlineFrame

Using keyboard UP and DOWN keys will loop thru the AutoCompleter's options WICKET-5275

If the currently selected item is the first one and the user uses KEY_UP then the selection will move to the last option. Similarly for KEY_DOWN - if the selected option is the last one then using DOWN key will move the selection to the first one.

Dependency updates

All libraries on which Wicket modules depend are updated to their latest stable versions.
The most notable ones are:

  • Spring Framework 3.2.2
  • ASM 4.1
  • CGLIB 3.0
  • SLF4J 1.7.5
  • Jetty (in the quickstart) 8.1.10
  • No labels