[ https://issues.apache.org/jira/browse/FELIX-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13931583#comment-13931583 ]
Benjamin Debeerst commented on FELIX-4455: ------------------------------------------ Then I get {{createInstance -> Cannot invoke the constructor (method not found)}} and {{Cannot create a POJO instance, the POJO constructor cannot be found}}. Full stack: {code} 2014-03-12 10:38:51,156 | ERROR | pool-1-thread-1 | ipojo-constructor | 91 - com.example.ipojo-constructor - 1.0.0.SNAPSHOT | [ERROR] : [com.example.ComponentWithoutDefaultConstructor-0] createInstance -> Cannot invoke the constructor (method not found) : com.example.ComponentWithoutDefaultConstructor.<init>(org.apache.felix.ipojo.InstanceManager, null) java.lang.NoSuchMethodException: com.example.ComponentWithoutDefaultConstructor.<init>(org.apache.felix.ipojo.InstanceManager, null) at java.lang.Class.getConstructor0(Class.java:2800)[:1.7.0_25] at java.lang.Class.getDeclaredConstructor(Class.java:2043)[:1.7.0_25] at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:703)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:923)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__M_stateChanged(LifecycleCallbackHandler.java:156)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.extender.internal.linker.ManagedType$InstanceSupport$1.call(ManagedType.java:312)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.extender.internal.linker.ManagedType$InstanceSupport$1.call(ManagedType.java:306)[84:org.apache.felix.ipojo:1.11.1] at org.apache.felix.ipojo.extender.internal.queue.JobInfoCallable.call(JobInfoCallable.java:114 [84:org.apache.felix.ipojo:1.11.1] at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25] at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_25] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_25] at java.lang.Thread.run(Thread.java:724)[:1.7.0_25] 2014-03-12 10:38:51,156 | ERROR | pool-1-thread-1 | ipojo-constructor | 91 - com.example.ipojo-constructor -1.0.0.SNAPSHOT | [ERROR] com.example.ComponentWithoutDefaultConstructor : Cannot create a POJO instance, the POJO constructor cannot be found {code} > Missing default constructor creates invalid class instances > ----------------------------------------------------------- > > Key: FELIX-4455 > URL: https://issues.apache.org/jira/browse/FELIX-4455 > Project: Felix > Issue Type: Bug > Components: iPOJO > Affects Versions: ipojo-manipulator-1.10.1, ipojo-manipulator-1.11.1 > Reporter: Benjamin Debeerst > > Consider the following component definition: > @Component > @Instantiate > public class ComponentWithoutDefaultConstructor > { > private Object internal = new Object(); > @Property > private String property; > /* Constructor for unit tests */ > public ComponentWithoutDefaultConstructor(String property) > { > System.out.println("Non-default constructor call!"); > this.property = property; > } > @Validate > public void activate() > { > System.out.println("ComponentWithoutDefaultConstructor: activating!"); > System.out.println(this.internal); > } > } > As per definition, I would expect every instance of this class to have a > non-null member {{internal}} at class creation. This is all fine for my unit > tests in a non-OSGi environment. > However, having this processes by iPOJO and putting this in an OSGi > container, the component outputs > ComponentWithoutDefaultConstructor: activating! > null > The existing non-default constructor is not called, while it seems that a > separate constructor has been created that does non instantiate the member > variable. > If I extend the code by an empty default constructor, that one is called and > all works perfectly fine. > I have no idea how iPOJO creates the object instance anyways, as it should > not be possible to create such an invalid object instance. I don't know much > about the reflection APIs or byte code manipulation though. > I have put a sample maven project on GitHub[1], which can be built and > droppped into a fresh Karaf container + iPOJO, which shows the problem. > If there is no constructor iPOJO can use, I would expect iPOJO to either A) > throw a warning/error (and build or runtime) and fail to instantiate the > component or B) synthesize the default constructor properly, including the > implicit instantiation of member variables. > I encountered this problem both with iPOJO 1.10.1 and 1.11.1. > [1] https://github.com/BenjaminDebeerst/ipojo-component-constructor-sample -- This message was sent by Atlassian JIRA (v6.2#6252)