Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Migrating to Wicket 6.0

Table of Contents
minLevel3

Environment

  • Wicket 6.0 requires at least Java 6

...

  • `StringValidator` will add the `maxlength` attribute if added to a component attached to an input tag
  • MinimumValidator and MaximumValidator are replaced by RangeValidator.minimum and RangeValidator.maximum respectively
  • `AbstractValidator` has been removed
  • `ValidationError` now makes creating standard error keys (classname and classname.subtype) easier. Before one had to do: new ValidationError().addMessageKey(validator.getClass().getSimpleName()) to construct the default key, now you can simply say new ValidationError(validator) and it will do the above for you. Also, for more specific keys one had to do new ValidationError().addMessageKey(validator.getClass().getSimpleName()+".variant"), now you can do new ValidationError(validator, "variant").
  • Most validators provide a `decorate(ValidationError, Validatable)` method for overriding how they report errors. For example, to add an extra resource key for the error message to StringValidator one can do

    Code Block
    
    class MyStringValidator extends StringValidator {
        ValidationError decorate(ValidationError error, IValidatable validatable) {
           error.addKey("mystringerror");
           return error;
        }
    }
    
  • org.apache.wicket.validation.RawValidationError is introduced. It can be used to bring a raw Serializable object which is registered as FeedbackMessage with org.apache.wicket.Component#error(Serializable).
  • IFormValidator can have its own resource bundle as other IValidator implementations. WICKET-3879
  • CheckBox never fails required check: WICKET-1221

Feedback Storage Refactoring

...

o.a.w.ajax.AjaxRequestTarget is an interface now with a default implementation o.a.w.ajax.AjaxRequestHandler. This way it will be possible to replace it with a different implementation, or mock/spy it in tests.
This change required to refactor AjaxRequestTarget.get() too. The replacement code is:

Code Block

  AjaxRequestTarget target = requestCycle.find(AjaxRequestTarget.class);

...

IHeaderResponse has been rewritten to render HeaderItems. All render* methods have been replaced by a single render(HeaderItem) method. HeaderItems can be instantiated using the factory methods in JavaScriptHeaderItem, CssHeaderItem, OnDomReadyHeaderItem, OnLoadHeaderItem, OnEventHeaderItem and StringHeaderItem. For example, the following code in renderHead:

Code Block

  response.renderCSSReference(new CssResourceReference(HomePage.class, "header.css"));
  response.renderJavaScriptReference(new JavaScriptResourceReference(HomePage.class, "page.js"));
  response.renderOnDomReadyJavaScript("foobar");

Needs to be replaced with:

Code Block

  response.render(CssHeaderItem.forReference(new CssResourceReference(HomePage.class, "header.css")));
  response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(HomePage.class, "page.js")));
  response.render(OnDomReadyHeaderItem.forScript("foobar));

...

  • ResourceStreamLocator now purely generates pathnames using a ResourceNameIterator and then uses a list of IResourceFinders to actually get those resources.
  • ResourceStreamLocator no longer does resource loading from the classpath on its own. Instead, there is now ClassPathResourceFinder.
  • IResourceSettings no longer contains just a single ResourceFinder but rather a list of them that will be tried in the given order.
  • Path and WebApplicationPath no longer extend each other, and also no longer have a list of prefixes, only a single one. If you need several path prefixes, simply add more Paths, WebApplicationPaths or other IResourceFinder implementations to IResourceSettings#resourcesFinders.
  • The IResourcePath interface was removed, since each ResourceFinder now only has one path.
  • replace getResourceSettings().addResourceFolder("some/path") with getResourceSettings().getResourceFinders().add(new WebApplicationPath(getServletContext(), "some/path));

Changes to org.apache.wicket.ajax.json.* (since Wicket 6.27.0) Image AddedWICKET-6287 - Switch from json.org to open-json RESOLVED

Because of license issues all classes in the mentioned package have been replaced by classes of open-json (https://github.com/tdunning/open-json) which means that the basic functionality is nearly the same. Some classes however (example: org.json.HTTP) are throwing WicketRuntimeExceptions because there is no corresponding implementation in open-json, yet. json.org can be used in this case (can be found in the central maven repository) if the license conditions are accepted.

Minor changes

  • Files#getLocalFileFromUrl(URL) decodes url before returning file
  • WizardStep header labels encode their model values by default, override WizardStep#getHeader() if you need the old behavior (i.e. model values not encoded)
  • IErrorMessageSource#substitute(Map<String,Object>) was merged into IErrorMessageSource#getMessage(String, Map<String,Object>)
  • org.apache.wicket.util.resource.IResourceStreamWriter#write() now works again with java.io.OutputStream as in Wicket 1.4.x. WICKET-4601
  • WicketTester.startPanel -> WicketTester.startComponentInPage
  • WebSession#authenticate() was moved to AuthenticatedWebSession and now abstract
  • ChoiceFilteredPropertyColumn/ChoiceFilter use DropDownChoice#setNullValid(true) now