Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expected type java.lang.Long for property id but imported type is java.lang.Object #2631

Closed
mvysny opened this issue Oct 7, 2017 · 4 comments
Assignees
Labels
Milestone

Comments

@mvysny
Copy link
Member

mvysny commented Oct 7, 2017

Flow 1.0.0.alpha3: I'd like to transfer the following class via Flow:

public interface Entity<ID> {
    ID getId();
}

public class Category implements Serializable, Entity<Long> {
   ...
}

(The Category class is actually taken from the Beverage Buddy example; I just added the Entity interface). When I launch this app, Flow complains with:

07-Oct-2017 13:22:11.380 SEVERE [http-nio-8080-exec-3] com.vaadin.server.DefaultErrorHandler.error 
 java.lang.IllegalArgumentException: Unable to create an instance of 'com.vaadin.starter.beveragebuddy.ui.ReviewsList'. The constructor threw an exception.
	at com.vaadin.util.ReflectTools.createProxyInstance(ReflectTools.java:502)
	at com.vaadin.util.ReflectTools.createInstance(ReflectTools.java:439)
	at com.vaadin.flow.di.DefaultInstantiator.createRouteTarget(DefaultInstantiator.java:75)
	at com.vaadin.router.NavigationStateRenderer.lambda$getRouteTarget$99(NavigationStateRenderer.java:87)
	at java.util.Optional.orElseGet(Optional.java:267)
	at com.vaadin.router.NavigationStateRenderer.getRouteTarget(NavigationStateRenderer.java:86)
	at com.vaadin.router.NavigationStateRenderer.handle(NavigationStateRenderer.java:112)
	at com.vaadin.router.Router.navigate(Router.java:107)
	at com.vaadin.router.Router.initializeUI(Router.java:86)
	at com.vaadin.ui.UI.doInit(UI.java:194)
	at com.vaadin.server.BootstrapHandler.createAndInitUI(BootstrapHandler.java:754)
	at com.vaadin.server.BootstrapHandler.synchronizedHandleRequest(BootstrapHandler.java:246)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1455)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:298)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.vaadin.util.ReflectTools.createProxyInstance(ReflectTools.java:471)
	... 37 more
Caused by: java.lang.IllegalArgumentException: Expected type java.lang.Long for property id but imported type is java.lang.Object
	at com.vaadin.flow.model.BeanModelType.lambda$findBeanGetters$89(BeanModelType.java:520)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
	at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
	at com.vaadin.flow.model.BeanModelType.findBeanGetters(BeanModelType.java:511)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at com.vaadin.flow.util.ReflectionCache.get(ReflectionCache.java:69)
	at com.vaadin.flow.model.BeanModelType.importProperties(BeanModelType.java:386)
	at com.vaadin.flow.model.BeanModelType.applicationToModel(BeanModelType.java:356)
	at com.vaadin.flow.model.BeanModelType.applicationToModel(BeanModelType.java:46)
	at com.vaadin.flow.model.BeanModelType.lambda$importProperties$86(BeanModelType.java:403)
	at java.util.HashMap.forEach(HashMap.java:1288)
	at com.vaadin.flow.model.BeanModelType.importProperties(BeanModelType.java:401)
	at com.vaadin.flow.model.BeanModelType.applicationToModel(BeanModelType.java:356)
	at com.vaadin.flow.model.ListModelType.importBeans(ListModelType.java:135)
	at com.vaadin.flow.model.ListModelType.applicationToModel(ListModelType.java:90)
	at com.vaadin.flow.model.ListModelType.applicationToModel(ListModelType.java:41)
	at com.vaadin.flow.model.TemplateModelProxyHandler.handleSetter(TemplateModelProxyHandler.java:321)
	at com.vaadin.flow.model.TemplateModelProxyHandler.intercept(TemplateModelProxyHandler.java:166)
	at com.vaadin.starter.beveragebuddy.ui.ReviewsList.ReviewsModel$.setReviews(Unknown Source)
	at com.vaadin.starter.beveragebuddy.ui.ReviewsList.updateList(ReviewsList.java:108)
	at com.vaadin.starter.beveragebuddy.ui.ReviewsList.<init>(ReviewsList.java:78)
	... 42 more

However, the field's type is java.lang.Long:

System.out.println("RETURN TYPE: " + Category.class.getDeclaredMethod("getId").getReturnType());

prints

RETURN TYPE: class java.lang.Long
@mvysny
Copy link
Member Author

mvysny commented Oct 7, 2017

Aha! There are two getId methods in such classes:

public java.lang.Object com.vaadin.starter.beveragebuddy.backend.Category.getId()
public java.lang.Long com.vaadin.starter.beveragebuddy.backend.Category.getId()

Which is weird, but this probably confuses Flow. So, in this case, Flow should use the method which is 'closer' to the Category class, since I believe that the first one (the one returning Object) is actually declared on the Entity interface.

mvysny pushed a commit to mvysny/vaadin-on-kotlin that referenced this issue Oct 7, 2017
@Legioth
Copy link
Member

Legioth commented Oct 10, 2017

For reference, we recently fixed another case where we were looking at the wrong method in cases where generics causes multiple methods to be present: #2561

@mvysny
Copy link
Member Author

mvysny commented Jan 2, 2018

Unfortunately this issue is still present in Vaadin 10.0.0.alpha11

@Legioth Legioth added the bug label Jan 3, 2018
@mvysny
Copy link
Member Author

mvysny commented Feb 20, 2018

It seems that Grid is now happy with Entity and correctly resolves the ID! That's great news!

Unfortunately, when I tried to make Review extend Entity, Flow complained:

java.lang.IllegalStateException: Duplicate key public void com.vaadin.starter.beveragebuddy.backend.Review.setId(java.lang.Long)
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1254)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
	at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.vaadin.flow.templatemodel.BeanModelType.findBeanSetters(BeanModelType.java:612)
	at com.vaadin.flow.templatemodel.BeanModelType.createInitialValues(BeanModelType.java:553)
	at com.vaadin.flow.templatemodel.TemplateModelProxyHandler.lambda$createProxyConstructor$3(TemplateModelProxyHandler.java:257)
	at com.vaadin.flow.templatemodel.TemplateModelProxyHandler.createModelProxy(TemplateModelProxyHandler.java:193)
	at com.vaadin.flow.templatemodel.BeanModelType.modelToApplication(BeanModelType.java:346)
	at com.vaadin.flow.server.communication.rpc.PublishedServerEventHandlerRpcHandler.getTemplateItem(PublishedServerEventHandlerRpcHandler.java:268)
	at com.vaadin.flow.server.communication.rpc.PublishedServerEventHandlerRpcHandler.decodeArg(PublishedServerEventHandlerRpcHandler.java:224)
	at com.vaadin.flow.server.communication.rpc.PublishedServerEventHandlerRpcHandler.decodeArgs(PublishedServerEventHandlerRpcHandler.java:174)
	at com.vaadin.flow.server.communication.rpc.PublishedServerEventHandlerRpcHandler.invokeMethod(PublishedServerEventHandlerRpcHandler.java:128)
	at com.vaadin.flow.server.communication.rpc.PublishedServerEventHandlerRpcHandler.invokeMethod(PublishedServerEventHandlerRpcHandler.java:113)
	at com.vaadin.flow.server.communication.rpc.PublishedServerEventHandlerRpcHandler.handleNode(PublishedServerEventHandlerRpcHandler.java:93)
	at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:60)
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:356)
	at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$0(ServerRpcHandler.java:346)
	at java.util.ArrayList.forEach(ArrayList.java:1255)
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:346)
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:288)
	at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:88)
	at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
	at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1512)
	at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:343)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1437)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

@pleku pleku added this to the 1.0 Maintenance milestone Mar 25, 2018
@denis-anisimov denis-anisimov self-assigned this May 31, 2018
@ZheSun88 ZheSun88 modified the milestones: 1.0 Maintenance, 1.0.0.rc2 Jun 6, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants