[
https://issues.apache.org/jira/browse/WICKET-1848?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12634481#action_12634481
]
Maarten Billemont commented on WICKET-1848:
-------------------------------------------
The bean definately does implement the AccountService interface; I even
verified it by iterating over and printing out into the log all Classes
returned by getClass().getInterfaces().
Looking at the wicket code that causes the exception:
(at
org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:416)):
public Object invoke(Object proxy, Method method, Object[]
args) throws Throwable
{
...
return method.invoke(target, args);
...
}
I am lead to believe that the "method.getDeclaredClass()" is NOT the same class
INSTANCE as that of "target"; even if it has the same descriptor. I have a
suspition that upon deserialization of the proxy object (after I submit my
form) the declared class of the Method is instantiated by a different
classloader than the classloader used to recreate the target object (which was
lost after the serialization of the Proxy, since it's a transient field in the
proxy).
> IllegalArgumentException while invoking method on injected proxy object
> (object is not an instance of declaring class)
> ----------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-1848
> URL: https://issues.apache.org/jira/browse/WICKET-1848
> Project: Wicket
> Issue Type: Bug
> Components: wicket, wicket-extensions
> Affects Versions: 1.4-M3
> Reporter: Maarten Billemont
> Assignee: Igor Vaynberg
>
> The problem description:
> I have some EJB service beans which I'd like to use in my wicket application.
> The service beans implement @Local interfaces which all have a public static
> final String BINDING field that contains the JNDI binding of the bean that
> implements them. I use this BINDING field to lookup the bean and inject it
> into my Wicket pages using the JavaEEComponentInjector.
> The problem, however, occurs when accessing methods of these injected bean
> proxy objects. I'm not entirely sure what the cause is and I've noticed the
> issue to be rather unpredictable - probably due to the fact that I really
> don't get what's going wrong.
> In any case; for some reason when I invoke methods on my proxy objects,
> Wicket's proxy object's reflection seems unable to actually perform the call
> on the target object. I know far too little of how proxy objects work
> internally to understand what exactly is going on and what exactly might be
> failing to give any more details than this.
> I'm not sure whether this is an issue in wicket-ioc or wicket-contrib-javaee
> though seeing as the exception originates from within LazyInitProxyFactory
> I'm betting on wicket-ioc (which isn't in the list of components of this
> JIRA?)
> The exception:
> org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface
> org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component
> [Marku
> at
> org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193)
> at
> org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73)
> at
> org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
> at
> org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1188)
> at org.apache.wicket.RequestCycle.step(RequestCycle.java:1265)
> at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1366)
> at org.apache.wicket.RequestCycle.request(RequestCycle.java:499)
> at
> org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:387)
> at
> org.apache.wicket.protocol.http.WicketServlet.doPost(WicketServlet.java:145)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at
> net.link.safeonline.sdk.auth.filter.ContainerLoginFilter.doFilter(ContainerLoginFilter.java:70)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at
> net.link.safeonline.sdk.auth.filter.JAASLoginFilter.doFilter(JAASLoginFilter.java:93)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at
> org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
> at
> org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
> at
> org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> at
> org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
> at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
> at java.lang.Thread.run(Thread.java:595)
> Caused by: java.lang.reflect.InvocationTargetException
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at
> org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182)
> ... 34 more
> Caused by: java.lang.IllegalArgumentException: object is not an instance of
> declaring class
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at
> org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:416)
> at org.apache.wicket.proxy.$Proxy1013.createAccount(Unknown Source)
> at
> net.link.safeonline.demo.bank.webapp.NewAccountPage$AccountForm.onSubmit(NewAccountPage.java:74)
> at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1347)
> at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:797)
> ... 39 more
> The (relevant) Wicket code:
> public class AccountApplication extends WebApplication {
> @Override
> protected void init() {
> addComponentInstantiationListener(new JavaEEComponentInjector(this,
> new IJndiNamingStrategy() {
> private final StandardJndiNamingStrategy defaultStrategy
> = new StandardJndiNamingStrategy();
> @SuppressWarnings("unchecked")
> public String calculateName(String ejbName, Class
> ejbType) {
> try {
> Field bindingField =
> ejbType.getDeclaredField("BINDING");
> Object binding = bindingField.get(null);
> if (binding != null)
> return binding.toString();
> } catch (Exception e) {
> ...
> }
> return this.defaultStrategy.calculateName(ejbName,
> ejbType);
> }
> }));
> }
> ...
> }
> public abstract class LayoutPage extends WebPage {
> @EJB
> transient AccountService accountService;
> ...
> }
> public class NewAccountPage extends LayoutPage {
> ...
> class AccountForm extends Form<String> {
> ...
> @Override
> protected void onSubmit() {
> accountService.createAccount(...);
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.