[
https://issues.apache.org/jira/browse/WICKET-6461?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16157437#comment-16157437
]
Sven Meier edited comment on WICKET-6461 at 9/7/17 7:06 PM:
------------------------------------------------------------
You're right, with a page mounted on
{{"/params/#{optional}/${required}"}}, a Url {{"params/required"}}
will hit that page but without any parameters.
Either it should not hit the page at all, or preferably create an instance with
the required parameter.
I'm working on a test case. For now you could insert a fixed segment between
the optional and required parameter, e.g.
{{"/params/#{optional}/fixed/${required}"}}.
was (Author: svenmeier):
You're right, with a page mounted on "/params/#{optional}/${required}", a Url
"params/required" will hit that page but without any parameters.
Either it should not hit the page at all, or preferably create an instance with
the required parameter.
I'm working on a test case. For now you could insert a fixed segment between
the optional and required parameter, e.g.
"/params/#{optional}/fixed/${required}"
> Default constructor is incorrectly called if optional param is not provided
> in parameter placeholder URL with additional required parameter
> -------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-6461
> URL: https://issues.apache.org/jira/browse/WICKET-6461
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 6.22.0
> Reporter: Melissa Beldman
> Attachments: quickstartPP.zip
>
>
> From the documentation here:
> https://ci.apache.org/projects/wicket/guide/6.x/guide/urls.html
> I'm following the section titled, "Using parameter placeholders with mounted
> pages".
> In the documentation from here:
> https://cwiki.apache.org/confluence/display/WICKET/Request+mapping
> {code}
> Named parameters - /page/${named1}/${named2}
> mountPage("/page/${named1}/${named2}", MyPage.class);
> Now a request to "/page/a/b" will be handled by MyPage and the parameters can
> be get with PageParameters.get(String) (e.g. parameters.get("named1") will
> return "a")
> Optional named parameters - /page/${named1}/#{named2\
> mountPage("/page/${named1}/#{named2}", MyPage.class);
> This means the second parameter is optional. Requests to "/page/a/b" ,
> "/page/a/b/" and "/page/a/" will be handled by MyPage and the parameters can
> be get with PageParameters.get(String) (e.g. parameters.get("named2") will
> return "b" for the first case and null for the second).
> The mapper is smart enough to handle optional named parameters in any
> segment, not just the last one.
> {code}
> it states: "The mapper is smart enough to handle optional named parameters in
> any segment, not just the last one."
> I've found it does matter IF other segments in the url are also parameter
> placeholders. The resulting behaviour is that if the optional parameter
> placeholder isn't provided in the URL, the page's default constructor gets
> called instead of the PageParameter constructor as expected (since there are
> still additional PageParameter data that may need to be processed by the
> page).
> Here is my example:
> From child class of AdtAuthenticatedWebApplication
> {code}
> @Override
> protected void init()
> {
> super.init();
> mountPage("/foo/#{optParam}/${otherParam}", MyPage.class);
> //mountPage("/foo/${otherParam}/#{optParam}", MyPage.class); <--- NOTE:
> This works as expected
> }
> {code}
> In child class of WebPage
> {code}
> public class MyPage extends WebPage
> {
> public MyPage(PageParameters parameters)
> {
> super(parameters);
> StringValue optParam = parameters.get("optParam");
> StringValue otherParam = parameters.get("otherParam");
> //do something...
> }
> private MyPage()
> {
> throw new IllegalAccessError("The default constructor should not be
> instantiated");
> }
> {code}
> And in a different class:
> {code}
> public static BookmarkablePageLink getBookmarkableLink(String id, String
> optParam, String otherParam)
> {
> PageParameters pageParam = new PageParameters();
>
> pageParam.add("otherParam", otherParam);
> if (optParam != null && !optParam.isEmpty())
> {
> pageParam.add("optParam", optParam);
> }
>
> return new BookmarkablePageLink(id, MyPage.class, pageParam);
>
> }
> {code}
> Here are the result of clicking on the BookmarkablePageLinks created:
> {code}
> /foo/baz/bar -- calls MyPage(PageParameters parameters) constructor
> /foo/bar -- attempts to call MyPage default constructor (exception thrown)
> {code}
> Exception thrown is:
> {code}
> Last cause: Class org.apache.wicket.session.DefaultPageFactory can not access
> a member of class ca.example.for.testing.MyPage with modifiers "private"
> WicketMessage: Can't instantiate page using constructor 'private
> ca.example.for.testing.MyPage()'. This constructor is private!
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)