You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Rick Bonnett <rb...@mesca.com> on 2013/04/16 14:38:22 UTC

SQLTemplate problems in 3.1B2

I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.


ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
ObjectContext context = cayenneRuntime.getContext();


SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
String pgSql = "SELECT * FROM live.tbl_accessorials";
sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
Collection<Accessorial> accessorials = context.performQuery(sql);


I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.

This seems to be the relevant section of the stack trace:

Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)

Any ideas on what I am missing here?

Thanks
Rick


Re: SQLTemplate problems in 3.1B2

Posted by Andrus Adamchik <an...@objectstyle.org>.
Hi Rick,

First thing to check is that you have velocity-1.6.3.jar in your .war under WEB-INF/lib/ 

If you do, then we need to look for a conflicting velocity.jar under Glassfish and discuss what we can do about it.

Andrus

On Apr 16, 2013, at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:

> I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
> In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.
> 
> 
> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
> ObjectContext context = cayenneRuntime.getContext();
> 
> 
> SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
> String pgSql = "SELECT * FROM live.tbl_accessorials";
> sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
> Collection<Accessorial> accessorials = context.performQuery(sql);
> 
> 
> I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.
> 
> This seems to be the relevant section of the stack trace:
> 
> Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)
> 
> Any ideas on what I am missing here?
> 
> Thanks
> Rick
> 


Re: SQLTemplate problems in 3.1B2

Posted by Mike Kienenberger <mk...@gmail.com>.
Like I said, the easiest solution is to put some of the example code I
sent you in place so that it dumps out the full list of resources
found on the classpath at the time of the error.

It might even be something weird and unexpected that causes the problem.

For example, running my j2ee apps inside eclipse would add every
WEB-INF/lib jar to my classpath twice -- once because they are in the
WEB-INF/lib System classpath, and once because they are in the
WebAppClassLoader jetty classpath.   I had to reconfigure jetty to
disable using the WebAppClassLoader.



On Tue, Apr 16, 2013 at 11:47 AM, Rick Bonnett <rb...@mesca.com> wrote:
>
> I verified that velocity-1.6.3.jar is in my WAR file, and after deploying my app it is sitting in the WEB-INF/lib directory as well. This was as I expected.
>
> If glass fish is somehow loading a different one I don't know where it would be coming from. I did do a search through every jar and war file on my system. The only reference I found to other versions was one in the m2e Eclipse plugin, which was for 1.5.something, but I don;t see how that could be anything glass fish would use.
>
>
> On Apr 16, 2013, at 9:59 AM, Mike Kienenberger <mk...@gmail.com> wrote:
>
>> My first guess would be that you have more than one velocity jar files
>> in the classpath.
>> I guess a second possibility is that you have no velocity jar files in
>> the classpath.
>>
>> We have an in-house findClass.jsp (backed by a ClassPath bean) which
>> we use for problems like this to identify all definitions of a class
>> in the classpath.   Unfortunately, I don't have permission to share
>> this.
>>
>> But you could probably come up with something similar:
>>
>>
>> Here's a jsp that looks like it identifies the first definition of a class.
>> http://mcpaint.tistory.com/13
>>
>>
>> Here's how to show all resources
>> http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/
>>
>> You'd probably want to combine the two.
>>
>>
>> Here's something else I came across while trying to find an example of
>> what you needed.  Not sure how easy it would be to integrate with your
>> app.
>>
>> http://classpathhelper.sourceforge.net/
>>
>> On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
>>> I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
>>> In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.
>>>
>>>
>>> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
>>> ObjectContext context = cayenneRuntime.getContext();
>>>
>>>
>>> SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
>>> String pgSql = "SELECT * FROM live.tbl_accessorials";
>>> sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
>>> Collection<Accessorial> accessorials = context.performQuery(sql);
>>>
>>>
>>> I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.
>>>
>>> This seems to be the relevant section of the stack trace:
>>>
>>> Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
>>> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
>>> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
>>> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
>>> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
>>> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
>>> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
>>> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
>>> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
>>> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
>>> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
>>> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
>>> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
>>> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
>>> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
>>> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
>>> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
>>> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
>>> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)
>>>
>>> Any ideas on what I am missing here?
>>>
>>> Thanks
>>> Rick
>>>
>

Re: SQLTemplate problems in 3.1B2

Posted by Rick Bonnett <rb...@mesca.com>.
I verified that velocity-1.6.3.jar is in my WAR file, and after deploying my app it is sitting in the WEB-INF/lib directory as well. This was as I expected.

If glass fish is somehow loading a different one I don't know where it would be coming from. I did do a search through every jar and war file on my system. The only reference I found to other versions was one in the m2e Eclipse plugin, which was for 1.5.something, but I don;t see how that could be anything glass fish would use.


On Apr 16, 2013, at 9:59 AM, Mike Kienenberger <mk...@gmail.com> wrote:

> My first guess would be that you have more than one velocity jar files
> in the classpath.
> I guess a second possibility is that you have no velocity jar files in
> the classpath.
> 
> We have an in-house findClass.jsp (backed by a ClassPath bean) which
> we use for problems like this to identify all definitions of a class
> in the classpath.   Unfortunately, I don't have permission to share
> this.
> 
> But you could probably come up with something similar:
> 
> 
> Here's a jsp that looks like it identifies the first definition of a class.
> http://mcpaint.tistory.com/13
> 
> 
> Here's how to show all resources
> http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/
> 
> You'd probably want to combine the two.
> 
> 
> Here's something else I came across while trying to find an example of
> what you needed.  Not sure how easy it would be to integrate with your
> app.
> 
> http://classpathhelper.sourceforge.net/
> 
> On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
>> I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
>> In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.
>> 
>> 
>> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
>> ObjectContext context = cayenneRuntime.getContext();
>> 
>> 
>> SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
>> String pgSql = "SELECT * FROM live.tbl_accessorials";
>> sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
>> Collection<Accessorial> accessorials = context.performQuery(sql);
>> 
>> 
>> I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.
>> 
>> This seems to be the relevant section of the stack trace:
>> 
>> Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
>> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
>> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
>> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
>> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
>> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
>> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
>> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
>> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
>> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
>> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
>> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
>> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
>> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
>> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
>> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
>> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
>> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
>> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)
>> 
>> Any ideas on what I am missing here?
>> 
>> Thanks
>> Rick
>> 


Re: SQLTemplate problems in 3.1B2

Posted by Andrus Adamchik <an...@objectstyle.org>.
I am glad you got this working, as investigating it fully may take time. 

>  It doesn't seem like I should have to go through all these hoops when I'm using maven to manage my dependencies for me.

Agreed. And I don't think it has anything to do with Maven or Cayenne. On the surface looks like a bug in Velocity classloading.

Andrus


On Apr 16, 2013, at 2:22 PM, Rick Bonnett <rb...@mesca.com> wrote:

> 
> I'm using glassfish 3.1.2. I have managed to get this working though.
> 
> What I ended up doing was explicitly putting the velocity jar file in my domains/domain1/lib folder under glassfish . This then resulted in a new class loader exception about commons.lang.StringUtils. So I put commons-lang-2.6 jar in the lib folder as well - now all works fine.
> 
> In my maven dependency hierarchy, I see that velocity-1.6.3 references commons-lang-2.4. I am also using commons-configuration-1.9 which references commons-lang-2.6. Maven is telling me it is omitting the commons-lang-2.4 because of the 2.6 conflict. All this seems related to me, but I'm not sure how.
> 
> If there's anything else you would like me to try at my end, I'll be glad to do so. It doesn't seem like I should have to go through all these hoops when I'm using maven to manage my dependencies for me.
> 
> I'm including my pom.xml file as well in case that's useful to you.
> 
> And thanks all for the great help so far…
> 
> 
> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
>  <modelVersion>4.0.0</modelVersion>
>  <groupId>CayenneServiceTemplate</groupId>
>  <artifactId>CayenneServiceTemplate</artifactId>
>  <version>1.0.0</version>
>  <dependencies>
>  <dependency>
>  <groupId>org.apache.cayenne</groupId>
>  <artifactId>cayenne-server</artifactId>
>  <version>3.1B2</version>
>  </dependency>
>  <dependency>
>  <groupId>org.jdom</groupId>
>  <artifactId>jdom</artifactId>
>  <version>1.1.3</version>
>  </dependency>
>  <dependency>
>  <groupId>com.sun.jersey</groupId>
>  <artifactId>jersey-grizzly2</artifactId>
>  <version>1.12</version>
>  </dependency>
>  <dependency>
>  <groupId>postgresql</groupId>
>  <artifactId>postgresql</artifactId>
>  <version>9.1-901.jdbc4</version>
>  </dependency>
>  <dependency>
>  <groupId>axis</groupId>
>  <artifactId>axis-jaxrpc</artifactId>
>  <version>1.4</version>
>  </dependency>
>  <dependency>
>  <groupId>axis</groupId>
>  <artifactId>axis</artifactId>
>  <version>1.4</version>
>  </dependency>
>  <dependency>
>  <groupId>com.google.code.gson</groupId>
>  <artifactId>gson</artifactId>
>  <version>2.2.2</version>
>  </dependency>
>  <dependency>
>  <groupId>org.codehaus.jackson</groupId>
>  <artifactId>jackson-jaxrs</artifactId>
>  <version>1.9.12</version>
>  </dependency>
>  <dependency>
>  <groupId>org.codehaus.jackson</groupId>
>  <artifactId>jackson-xc</artifactId>
>  <version>1.9.12</version>
>  </dependency>
>  <dependency>
>  <groupId>commons-configuration</groupId>
>  <artifactId>commons-configuration</artifactId>
>  <version>1.9</version>
>  </dependency>
>  <dependency>
>  <groupId>org.apache.httpcomponents</groupId>
>  <artifactId>httpclient</artifactId>
>  <version>4.2.2</version>
>  </dependency>
> 
>  </dependencies>
> </project>
> 
> On Apr 16, 2013, at 1:51 PM, Andrus Adamchik <an...@objectstyle.org>> wrote:
> 
> SQLTemplate backend relies on Velocity. EJBQLQuery backend relies on SQLTemplate. No other queries rely on Velocity or SQLTemplate, and Java class loading is lazy. So Velocity is likely the culprit.
> 
> So which Glassfish version do you have? Maybe I can try a basic test in an isolated environment.
> 
> Andrus
> 
> On Apr 16, 2013, at 1:26 PM, Rick Bonnett <rb...@mesca.com>> wrote:
> OK. One more level down the rabbit hole now…
> 
> now that I have velocity seemingly loading, I get this in the stack trace:
> 
> Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.cayenne.access.jdbc.SQLTemplateProcessor
> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:90)
> 
> I'm very puzzled as to why other Cayenne classes and methods sen to work fine. For example, this code works within the same web service:
> 
> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
> ObjectContext context = cayenneRuntime.getContext();
> 
> 
> SelectQuery select1 = new SelectQuery(Accessorial.class);
> Collection<Accessorial> accessorials = context.performQuery(select1);
> 
> Just in general, I've yet to get a SQLTemplate or EJBQLQuery to work when running in glassfish, although using SelectQuery has given me no problems.
> 
> 
> 
> On Apr 16, 2013, at 9:59 AM, Mike Kienenberger <mk...@gmail.com>> wrote:
> 
> My first guess would be that you have more than one velocity jar files
> in the classpath.
> I guess a second possibility is that you have no velocity jar files in
> the classpath.
> 
> We have an in-house findClass.jsp (backed by a ClassPath bean) which
> we use for problems like this to identify all definitions of a class
> in the classpath.   Unfortunately, I don't have permission to share
> this.
> 
> But you could probably come up with something similar:
> 
> 
> Here's a jsp that looks like it identifies the first definition of a class.
> http://mcpaint.tistory.com/13
> 
> 
> Here's how to show all resources
> http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/
> 
> You'd probably want to combine the two.
> 
> 
> Here's something else I came across while trying to find an example of
> what you needed.  Not sure how easy it would be to integrate with your
> app.
> 
> http://classpathhelper.sourceforge.net/
> 
> On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
> I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
> In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.
> 
> 
> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
> ObjectContext context = cayenneRuntime.getContext();
> 
> 
> SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
> String pgSql = "SELECT * FROM live.tbl_accessorials";
> sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
> Collection<Accessorial> accessorials = context.performQuery(sql);
> 
> 
> I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.
> 
> This seems to be the relevant section of the stack trace:
> 
> Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)
> 
> Any ideas on what I am missing here?
> 
> Thanks
> Rick
> 
> 


Re: SQLTemplate problems in 3.1B2

Posted by Rick Bonnett <rb...@mesca.com>.
I'm using glassfish 3.1.2. I have managed to get this working though.

What I ended up doing was explicitly putting the velocity jar file in my domains/domain1/lib folder under glassfish . This then resulted in a new class loader exception about commons.lang.StringUtils. So I put commons-lang-2.6 jar in the lib folder as well - now all works fine.

In my maven dependency hierarchy, I see that velocity-1.6.3 references commons-lang-2.4. I am also using commons-configuration-1.9 which references commons-lang-2.6. Maven is telling me it is omitting the commons-lang-2.4 because of the 2.6 conflict. All this seems related to me, but I'm not sure how.

If there's anything else you would like me to try at my end, I'll be glad to do so. It doesn't seem like I should have to go through all these hoops when I'm using maven to manage my dependencies for me.

I'm including my pom.xml file as well in case that's useful to you.

And thanks all for the great help so far…


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>CayenneServiceTemplate</groupId>
  <artifactId>CayenneServiceTemplate</artifactId>
  <version>1.0.0</version>
  <dependencies>
  <dependency>
  <groupId>org.apache.cayenne</groupId>
  <artifactId>cayenne-server</artifactId>
  <version>3.1B2</version>
  </dependency>
  <dependency>
  <groupId>org.jdom</groupId>
  <artifactId>jdom</artifactId>
  <version>1.1.3</version>
  </dependency>
  <dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-grizzly2</artifactId>
  <version>1.12</version>
  </dependency>
  <dependency>
  <groupId>postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>9.1-901.jdbc4</version>
  </dependency>
  <dependency>
  <groupId>axis</groupId>
  <artifactId>axis-jaxrpc</artifactId>
  <version>1.4</version>
  </dependency>
  <dependency>
  <groupId>axis</groupId>
  <artifactId>axis</artifactId>
  <version>1.4</version>
  </dependency>
  <dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.2.2</version>
  </dependency>
  <dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-jaxrs</artifactId>
  <version>1.9.12</version>
  </dependency>
  <dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-xc</artifactId>
  <version>1.9.12</version>
  </dependency>
  <dependency>
  <groupId>commons-configuration</groupId>
  <artifactId>commons-configuration</artifactId>
  <version>1.9</version>
  </dependency>
  <dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.2.2</version>
  </dependency>

  </dependencies>
</project>

On Apr 16, 2013, at 1:51 PM, Andrus Adamchik <an...@objectstyle.org>> wrote:

SQLTemplate backend relies on Velocity. EJBQLQuery backend relies on SQLTemplate. No other queries rely on Velocity or SQLTemplate, and Java class loading is lazy. So Velocity is likely the culprit.

So which Glassfish version do you have? Maybe I can try a basic test in an isolated environment.

Andrus

On Apr 16, 2013, at 1:26 PM, Rick Bonnett <rb...@mesca.com>> wrote:
OK. One more level down the rabbit hole now…

now that I have velocity seemingly loading, I get this in the stack trace:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.cayenne.access.jdbc.SQLTemplateProcessor
at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:90)

I'm very puzzled as to why other Cayenne classes and methods sen to work fine. For example, this code works within the same web service:

ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
ObjectContext context = cayenneRuntime.getContext();


SelectQuery select1 = new SelectQuery(Accessorial.class);
Collection<Accessorial> accessorials = context.performQuery(select1);

Just in general, I've yet to get a SQLTemplate or EJBQLQuery to work when running in glassfish, although using SelectQuery has given me no problems.



On Apr 16, 2013, at 9:59 AM, Mike Kienenberger <mk...@gmail.com>> wrote:

My first guess would be that you have more than one velocity jar files
in the classpath.
I guess a second possibility is that you have no velocity jar files in
the classpath.

We have an in-house findClass.jsp (backed by a ClassPath bean) which
we use for problems like this to identify all definitions of a class
in the classpath.   Unfortunately, I don't have permission to share
this.

But you could probably come up with something similar:


Here's a jsp that looks like it identifies the first definition of a class.
http://mcpaint.tistory.com/13


Here's how to show all resources
http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/

You'd probably want to combine the two.


Here's something else I came across while trying to find an example of
what you needed.  Not sure how easy it would be to integrate with your
app.

http://classpathhelper.sourceforge.net/

On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.


ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
ObjectContext context = cayenneRuntime.getContext();


SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
String pgSql = "SELECT * FROM live.tbl_accessorials";
sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
Collection<Accessorial> accessorials = context.performQuery(sql);


I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.

This seems to be the relevant section of the stack trace:

Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)

Any ideas on what I am missing here?

Thanks
Rick



Re: SQLTemplate problems in 3.1B2

Posted by Andrus Adamchik <an...@objectstyle.org>.
SQLTemplate backend relies on Velocity. EJBQLQuery backend relies on SQLTemplate. No other queries rely on Velocity or SQLTemplate, and Java class loading is lazy. So Velocity is likely the culprit. 

So which Glassfish version do you have? Maybe I can try a basic test in an isolated environment.

Andrus

On Apr 16, 2013, at 1:26 PM, Rick Bonnett <rb...@mesca.com> wrote:
> OK. One more level down the rabbit hole now…
> 
> now that I have velocity seemingly loading, I get this in the stack trace:
> 
> Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.cayenne.access.jdbc.SQLTemplateProcessor
> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:90)
> 
> I'm very puzzled as to why other Cayenne classes and methods sen to work fine. For example, this code works within the same web service:
> 
> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
> ObjectContext context = cayenneRuntime.getContext();
> 
> 
> SelectQuery select1 = new SelectQuery(Accessorial.class);
> Collection<Accessorial> accessorials = context.performQuery(select1);
> 
> Just in general, I've yet to get a SQLTemplate or EJBQLQuery to work when running in glassfish, although using SelectQuery has given me no problems.
> 
> 
> 
> On Apr 16, 2013, at 9:59 AM, Mike Kienenberger <mk...@gmail.com>> wrote:
> 
> My first guess would be that you have more than one velocity jar files
> in the classpath.
> I guess a second possibility is that you have no velocity jar files in
> the classpath.
> 
> We have an in-house findClass.jsp (backed by a ClassPath bean) which
> we use for problems like this to identify all definitions of a class
> in the classpath.   Unfortunately, I don't have permission to share
> this.
> 
> But you could probably come up with something similar:
> 
> 
> Here's a jsp that looks like it identifies the first definition of a class.
> http://mcpaint.tistory.com/13
> 
> 
> Here's how to show all resources
> http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/
> 
> You'd probably want to combine the two.
> 
> 
> Here's something else I came across while trying to find an example of
> what you needed.  Not sure how easy it would be to integrate with your
> app.
> 
> http://classpathhelper.sourceforge.net/
> 
> On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
> I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
> In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.
> 
> 
> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
> ObjectContext context = cayenneRuntime.getContext();
> 
> 
> SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
> String pgSql = "SELECT * FROM live.tbl_accessorials";
> sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
> Collection<Accessorial> accessorials = context.performQuery(sql);
> 
> 
> I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.
> 
> This seems to be the relevant section of the stack trace:
> 
> Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)
> 
> Any ideas on what I am missing here?
> 
> Thanks
> Rick


Re: SQLTemplate problems in 3.1B2

Posted by Rick Bonnett <rb...@mesca.com>.
OK. One more level down the rabbit hole now…

now that I have velocity seemingly loading, I get this in the stack trace:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.cayenne.access.jdbc.SQLTemplateProcessor
at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:90)

I'm very puzzled as to why other Cayenne classes and methods sen to work fine. For example, this code works within the same web service:

ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
ObjectContext context = cayenneRuntime.getContext();


SelectQuery select1 = new SelectQuery(Accessorial.class);
Collection<Accessorial> accessorials = context.performQuery(select1);

Just in general, I've yet to get a SQLTemplate or EJBQLQuery to work when running in glassfish, although using SelectQuery has given me no problems.



On Apr 16, 2013, at 9:59 AM, Mike Kienenberger <mk...@gmail.com>> wrote:

My first guess would be that you have more than one velocity jar files
in the classpath.
I guess a second possibility is that you have no velocity jar files in
the classpath.

We have an in-house findClass.jsp (backed by a ClassPath bean) which
we use for problems like this to identify all definitions of a class
in the classpath.   Unfortunately, I don't have permission to share
this.

But you could probably come up with something similar:


Here's a jsp that looks like it identifies the first definition of a class.
http://mcpaint.tistory.com/13


Here's how to show all resources
http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/

You'd probably want to combine the two.


Here's something else I came across while trying to find an example of
what you needed.  Not sure how easy it would be to integrate with your
app.

http://classpathhelper.sourceforge.net/

On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.


ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
ObjectContext context = cayenneRuntime.getContext();


SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
String pgSql = "SELECT * FROM live.tbl_accessorials";
sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
Collection<Accessorial> accessorials = context.performQuery(sql);


I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.

This seems to be the relevant section of the stack trace:

Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)

Any ideas on what I am missing here?

Thanks
Rick



Re: SQLTemplate problems in 3.1B2

Posted by Mike Kienenberger <mk...@gmail.com>.
My first guess would be that you have more than one velocity jar files
in the classpath.
I guess a second possibility is that you have no velocity jar files in
the classpath.

We have an in-house findClass.jsp (backed by a ClassPath bean) which
we use for problems like this to identify all definitions of a class
in the classpath.   Unfortunately, I don't have permission to share
this.

But you could probably come up with something similar:


Here's a jsp that looks like it identifies the first definition of a class.
http://mcpaint.tistory.com/13


Here's how to show all resources
http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/

You'd probably want to combine the two.


Here's something else I came across while trying to find an example of
what you needed.  Not sure how easy it would be to integrate with your
app.

http://classpathhelper.sourceforge.net/

On Tue, Apr 16, 2013 at 8:38 AM, Rick Bonnett <rb...@mesca.com> wrote:
> I'm trying to use SQLTemplate queries and running into a strange problem. This snippet works fine if I run it in a plain Java application, but fails if I then use it within a web service running under Glassfish.
> In both cases I am using the same cayenne metadata files. I have also noticed the same issue when using EJBQL queries.
>
>
> ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-cayenne-service-template.xml");
> ObjectContext context = cayenneRuntime.getContext();
>
>
> SQLTemplate  sql = new SQLTemplate(Accessorial.class,"SELECT * FROM live.tbl_accessorials");
> String pgSql = "SELECT * FROM live.tbl_accessorials";
> sql.setTemplate(PostgresAdapter.class.getName(), pgSql);
> Collection<Accessorial> accessorials = context.performQuery(sql);
>
>
> I have tried this both with and without the Postgres specific template - same result either way. Works fine in a console app, fails running under the web server.
>
> This seems to be the relevant section of the stack trace:
>
> Caused by: java.lang.NoClassDefFoundError: org/apache/velocity/runtime/parser/ParseException
> at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:102)
> at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
> at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
> at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
> at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
> at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
> at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
> at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
> at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
> at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
> at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
> at com.mesca.services.AccessorialService.allAccessorialRows(AccessorialService.java:83)
>
> Any ideas on what I am missing here?
>
> Thanks
> Rick
>