object is not an instance of declaring class
Added by Bob Milstead about 1 year ago
Using 0.5.0 when trying to execute a named query from my interface extending GenericDAO I get an exception "object is not an instance of declaring class". I have other named queries working just fine, but there is a problem here and I just don't know how to find it. Any suggestions would be greatly appreciated.
I simplified the query down to something really basic. Here is my setup:
I have a test class that calls the method with this code:
List<ProcessInstanceDTO> processList = getProcessInstanceDao().findAllFooBar();
1 public interface ProcessInstanceDao
2 extends GenericDao<ProcessInstanceDTO, Integer>, ProcessInstanceDaoCustom
3 {
4 public List<ProcessInstanceDTO> findAllFooBar();
5 }
There is only one method in ProcessInstanceDaoCustom, a create method that has nothing to do with this query.
1 <bean id="processInstanceDaoCustom" class="com.hrworx.formworx.dao.process.ProcessInstanceDaoImpl"
2 parent="daoTemplate" />
3
4 <hades:dao-config base-package="com.hrworx.formworx.dao.process">
5 <hades:dao id="processInstance" custom-impl-ref="processInstanceDaoCustom" />
6 </hades:dao-config>
Here is the Persistable (I know it is not a DTO but I inherited the naming convention from legacy project code)
The query does not get any simpler than this. If I move the method from the GenericDao implementation to the custom implementation and call the named query from there using getJpaTemplate().findByNamedQuery it works fine, so I know the query is OK.
1 @NamedQueries( { @NamedQuery(name = "FindAllFooBar", query = "FROM com.hrworx.formworx.model.process.ProcessInstanceDTO")})
2
3 @Entity
4 @Table(name = "Process_Instances")
5 public class ProcessInstanceDTO
6 implements Persistable<Integer>
7
8 {
9 /** */
10 @Id
11 @GeneratedValue(strategy = GenerationType.AUTO, generator = "processinstance_seq_gen")
12 @SequenceGenerator(name = "processinstance_seq_gen", sequenceName = "Process_Instance_Seq")
13 @Column(name = "id")
14 private Integer pk;
15
16 ...
17
18 /**
19 * @return the pk
20 */
21 public Integer getPk()
22 {
23 return pk;
24 }
25
26 /**
27 * @param pk the pk to set
28 */
29 public void setPk(Integer pk)
30 {
31 this.pk = pk;
32 }
33
34 ....
35
36 public Integer getId()
37 {
38 return pk;
39 }
40
41 public boolean isNew()
42 {
43 return pk == null;
44 }
45 }
Here is the full stack trace:
1 java.lang.IllegalArgumentException: object is not an instance of declaring class
2 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
3 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
4 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
5 at java.lang.reflect.Method.invoke(Method.java:585)
6 at org.synyx.hades.dao.orm.GenericDaoFactory$FinderExecuterMethodInterceptor.invoke(GenericDaoFactory.java:402)
7 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
8 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
9 at $Proxy92.findAllFooBar(Unknown Source)
10 at com.hrworx.formworx.dao.process.TestProcessInstanceDao.testFindAllByEntityAndProcessType(TestProcessInstanceDao.java:67)
11 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
12 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
13 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
14 at java.lang.reflect.Method.invoke(Method.java:585)
15 at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
16 at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
17 at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
18 at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
19 at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
20 at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
21 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
22 at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
23 at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
24 at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
25 at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
26 at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
27 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
28 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
29 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
30 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
31 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
32 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
33 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Replies
RE: object is not an instance of declaring class
-
Added by Bob Milstead about 1 year ago
The answer to this was that the method was misnamed......I called it findAllFooBar, but it should have been findByMyParam The prefix for an automatically generated query is definable, but the default is to start with findBy and it then expects one or more search params.
RE: object is not an instance of declaring class
-
Added by Oliver Gierke about 1 year ago
Hey Bob,
sorry for seeing this so late. Just some small comments on that:
As you pointed out correctly, we insist on a finder prefix to clearly distinguish finder methods from customly implemented ones. Seems you got the details about tweaking the prefix already. :)
Simply finding all entities is already possible with readAll from the GenericDao interface. So there is actually no need to wirte a custom query for this. But I guess the code serves experimental purposes, right?
To get Hades to find a NamedQuery the query has to be named ${entityName}.${finderMethodname} thus in your case:
1 @NamedQuery(name = "ProcessInstanceDTO.findByAllFooBar", ...)
Regards,
Ollie
PS: Brushed up your post a little bit...