ผมมีทดลองใช้ Grails 1.2 และใช้ javax.jms.ObjectMessage แล้วขี้น error แบบนี้ java.lang.ClassNotFoundException: javax.jms.JMSException

116 views
Skip to first unread message

tue2551

unread,
Jan 27, 2010, 10:31:58 PM1/27/10
to กลุ่มผู้ใช้เกรลส์ในไทย
ผมมีทดลองใช้ Grails 1.2 และลง plugin Flex ที่มีการ config เรียกใช้
javax.jms.ObjectMessage
แล้วขี้น error แบบนี้ java.lang.ClassNotFoundException:
javax.jms.JMSException
ไม่แน่ใจว่าเกิดจากการ config ใน plugin ไม่รองรับ Spring 3.0 ใน Grails
1.2 หรือเปล่า
ฝากแนะนำด้วยครับ
ขอบคุณครับ.

นำตัวอย่างมาจากที่นี้ครับ
http://blog.xebia.com/2008/02/20/tutorial-master-detail-screen-in-flex-backed-up-by-grails-application/

ตัวอย่าง config
<service id="message-service"
class="flex.messaging.services.MessageService"
messageTypes="flex.messaging.messages.AsyncMessage">

<adapters>
<adapter-definition id="jms"
class="flex.messaging.services.messaging.adapters.JMSAdapter"
default="true" />
</adapters>

<destination id="updatesJmsTopic">
<properties>
<jms>
<message-type>javax.jms.ObjectMessage</message-type>
<connection-factory>ConnectionFactory</connection-factory>
<destination-jndi-name>addresses</destination-jndi-name>
<delivery-mode>NON_PERSISTENT</delivery-mode>
<message-priority>DEFAULT_PRIORITY</message-priority>
<acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>
<transacted-sessions>false</transacted-sessions>
<initial-context-environment>
<property>
<name>Context.PROVIDER_URL</name>
<value>vm://localhost</value>
</property>
<property>
<name>Context.INITIAL_CONTEXT_FACTORY</name>

<value>org.apache.activemq.jndi.ActiveMQInitialContextFactory</value>
</property>
<property>
<name>topic.addresses</name>
<value>addresses</value>
</property>
</initial-context-environment>
</jms>
</properties>
</destination>
</service>

ขึ้น error แบบนี้ครับ

2553-01-28 09:59:45,690 [main] ERROR [localhost].[/mytestapp] -
Servlet /mytestapp threw load() exception
java.lang.ClassNotFoundException: javax.jms.JMSException
at org.codehaus.groovy.tools.RootLoader.findClass
(RootLoader.java:156)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at org.codehaus.groovy.tools.RootLoader.loadClass
(RootLoader.java:128)
at
org.codehaus.groovy.grails.cli.support.GrailsRootLoader.loadClass
(GrailsRootLoader.java:43)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:
320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at flex.messaging.util.ClassUtil.createClass(ClassUtil.java:
60)
at flex.messaging.Destination.createAdapter(Destination.java:
336)
at flex.messaging.config.MessagingConfiguration.createAdapter
(MessagingConfiguration.java:359)
at
flex.messaging.config.MessagingConfiguration.createDestination
(MessagingConfiguration.java:351)
at flex.messaging.config.MessagingConfiguration.createServices
(MessagingConfiguration.java:319)
at flex.messaging.config.MessagingConfiguration.configureBroker
(MessagingConfiguration.java:99)
at flex.messaging.MessageBrokerServlet.init
(MessageBrokerServlet.java:125)
at org.apache.catalina.core.StandardWrapper.loadServlet
(StandardWrapper.java:1173)
at org.apache.catalina.core.StandardWrapper.load
(StandardWrapper.java:993)

Chanwit Kaewkasi

unread,
Jan 28, 2010, 3:06:11 AM1/28/10
to thai-gra...@googlegroups.com
คิดว่าไม่มี jar ของ jms นะครับ
ได้ลงทั้ง jms ทั้ง activemq plugin รึเปล่าครับ?

-ชาญวิทย์

2010/1/28 tue2551 <mnk...@gmail.com>:

--
Chanwit Kaewkasi

MNK TUE

unread,
Jan 28, 2010, 5:13:29 AM1/28/10
to thai-gra...@googlegroups.com
 ผมยังไม่ได้ลงเลยครับ...
...นึกว่า Grails มีรองรับอยู้แล้ว
...เป็นใน lib ของ Grails มี spring-jms หรืออะไรนี้ล่ะผมก็เลยไม่ได้ลงครับ.
...ยังไงจะทดลองลงดูอีกทีครับ.
ขอบคุณ คุญชาญวิทย์ มากเลยครับ.

2010/1/28 Chanwit Kaewkasi <cha...@gmail.com>
330.gif

tue2551

unread,
Feb 1, 2010, 12:36:14 AM2/1/10
to กลุ่มผู้ใช้เกรลส์ในไทย
ผมลองลง plugin activmq และ jms ตามนี้แล้วครับ...

แต่เกิด error เวลา flex เรียกข้อมูล remote Object
ขึ้นแบบนี้ยาวเลยครับ...
...แต่ถ้าเราไม่ใช้การทำงานผ่าน jms กรณีที่ server ต้องแจ้งอะไรไปหา
Client ก็ไม่มี error อะไรครับ.
...ตอนนี้ผมก็ใช้แบบไม่ผ่าน jms ไปก่อนได้ครับ.
...แต่ส่งสัยว่าในตัวอย่างเค้าทำได้ไง อาจจะใช้กับ Grails ต่าง version
กันไม่ได้หรือเปล่าครับ.

แล้วผมลองใช้ plugin graniteds ก็จะมี error เช่นกัน
...เวลา Message Validation จะที่ส่งจาก server ไปหา flex

เลยไม่รู้ว่าการส่ง Message ของ Spring 3.0 ที่ใช้ใน Grails 1.2
เปลี่ยนอะไรไป
...แล้วทำให้ plugin เดิมที่มีอยู่ใช้ตรงนี้ไม่ได้ครับ.

ขอบคุณครับ.

ตัวอย่าง error ของ plugin flex ที่มีการใช้ jms ครับ.
2553-02-01 12:20:57,072 [http-8080-3] ERROR
hibernate.LazyInitializationException - could not initialize proxy -
no Session
org.hibernate.LazyInitializationException: could not initialize proxy
- no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize
(AbstractLazyInitializer.java:86)
at
org.hibernate.proxy.AbstractLazyInitializer.getImplementation
(AbstractLazyInitializer.java:140)
at
org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer.invoke
(GroovyAwareJavassistLazyInitializer.java:211)
at Address_$$_javassist_1.getCity(Address_$$_javassist_1.java)
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:597)
at flex.messaging.io.BeanProxy$BeanProperty.get(BeanProxy.java:
738)
at flex.messaging.io.BeanProxy.getBeanValue(BeanProxy.java:
199)
at flex.messaging.io.BeanProxy.getValue(BeanProxy.java:176)
at flex.messaging.io.amf.Amf3Output.writePropertyProxy
(Amf3Output.java:565)
at flex.messaging.io.amf.Amf3Output.writeCustomObject
(Amf3Output.java:518)
at flex.messaging.io.amf.Amf3Output.writeObject
(Amf3Output.java:193)
at flex.messaging.io.amf.Java15Amf3Output.writeObject
(Java15Amf3Output.java:26)
at flex.messaging.io.amf.Amf3Output.writeObjectArray
(Amf3Output.java:817)
at flex.messaging.io.amf.Amf3Output.writeAMFArray
(Amf3Output.java:431)
at flex.messaging.io.amf.Amf3Output.writeObject
(Amf3Output.java:179)
at flex.messaging.io.amf.Java15Amf3Output.writeObject
(Java15Amf3Output.java:26)
at flex.messaging.io.ArrayCollection.writeExternal
(ArrayCollection.java:97)
at flex.messaging.io.amf.Amf3Output.writePropertyProxy
(Amf3Output.java:556)
at flex.messaging.io.amf.Amf3Output.writeArrayCollection
(Amf3Output.java:462)
at flex.messaging.io.amf.Amf3Output.writeObject
(Amf3Output.java:175)
at flex.messaging.io.amf.Java15Amf3Output.writeObject
(Java15Amf3Output.java:26)
at flex.messaging.io.amf.Amf3Output.writeObjectProperty
(Amf3Output.java:243)
at flex.messaging.io.amf.Amf3Output.writePropertyProxy
(Amf3Output.java:566)
at flex.messaging.io.amf.Amf3Output.writeCustomObject
(Amf3Output.java:518)
at flex.messaging.io.amf.Amf3Output.writeObject
(Amf3Output.java:193)
at flex.messaging.io.amf.Java15Amf3Output.writeObject
(Java15Amf3Output.java:26)
at flex.messaging.messages.AbstractMessage.writeExternal
(AbstractMessage.java:352)
at flex.messaging.messages.AsyncMessage.writeExternal
(AsyncMessage.java:140)
at flex.messaging.messages.AcknowledgeMessage.writeExternal
(AcknowledgeMessage.java:92)
at flex.messaging.messages.AcknowledgeMessageExt.writeExternal
(AcknowledgeMessageExt.java:55)
at flex.messaging.io.amf.Amf3Output.writePropertyProxy
(Amf3Output.java:556)
at flex.messaging.io.amf.Amf3Output.writeCustomObject
(Amf3Output.java:518)
at flex.messaging.io.amf.Amf3Output.writeObject
(Amf3Output.java:193)
at flex.messaging.io.amf.Java15Amf3Output.writeObject
(Java15Amf3Output.java:26)
at flex.messaging.io.amf.Amf0Output.writeObject
(Amf0Output.java:193)
at flex.messaging.io.amf.Java15Amf0Output.writeObject
(Java15Amf0Output.java:41)
at flex.messaging.io.amf.AmfMessageSerializer.writeObject
(AmfMessageSerializer.java:196)
at flex.messaging.io.amf.AmfMessageSerializer.writeBody
(AmfMessageSerializer.java:186)
at flex.messaging.io.amf.AmfMessageSerializer.writeMessage
(AmfMessageSerializer.java:142)
at flex.messaging.endpoints.amf.SerializationFilter.invoke
(SerializationFilter.java:179)
at flex.messaging.endpoints.BaseHTTPEndpoint.service
(BaseHTTPEndpoint.java:274)
at flex.messaging.MessageBrokerServlet.service
(MessageBrokerServlet.java:377)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
820)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.processFilterChain
(UrlMappingsFilter.java:282)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal
(UrlMappingsFilter.java:95)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent
(GrailsPageFilter.java:249)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter
(GrailsPageFilter.java:140)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal
(GrailsReloadServletFilter.java:101)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal
(GrailsWebRequestFilter.java:65)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal
(HiddenHttpMethodFilter.java:63)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal
(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate
(DelegatingFilterProxy.java:237)
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter
(DelegatingFilterProxy.java:167)
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:233)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process
(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run
(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)

ตัวอย่าง error ของ plugin graniteds flex ที่มีการแจ้ง Validate
ใส่ข้อมูลราคาหนังสือเกิด 3 หลักครับ.
org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'Book' on field 'price': rejected value
[7890.0]; codes
[Book.price.max.error.Book.price,Book.price.max.error.price,Book.price.max.error.java.lang.Float,Book.price.max.error,book
.price.max.error.Book.price,book.price.max.error.price,book.price.max.error.java.lang.Float,book.price.max.error,Book.price.max.exceeded.Book.price,Book.price.max.exceeded.price,Book.price.max.exceede
d.java.lang.Float,Book.price.max.exceeded,book.price.max.exceeded.Book.price,book.price.max.exceeded.price,book.price.max.exceeded.java.lang.Float,book.price.max.exceeded,max.exceeded.Book.price,max.e
xceeded.price,max.exceeded.java.lang.Float,max.exceeded]; arguments
[price,class Book,7890.0,999.0]; default message [คุณสมบัติ [{0}]
ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}]]
2553-01-21 11:55:42,100 [http-8080-1] ERROR
service.DefaultServiceExceptionHandler
- Could not process remoting message:
flex.messaging.messages.RemotingMessage {
source = null
operation = invokeComponent
correlationId = null
destination = spring
headers = {DSId=92D04B0B-4B2F-47FE-8905-38FA884CBFCE, DSEndpoint=my-
graniteamf}
messageId = 3E8C3B85-B699-DB96-544E-4F3C600BA960
timestamp = 0
clientId = B115F15D-3973-48F1-BAF9-855DB8F4420F
timeToLive = 0
body = [bookController, persist, [Ljava.lang.Object;@114f7c0,
org.granite.tide.invocation.InvocationCall@1957352]
}
org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException:
Executing action [persist] of controller [BookController] caused
exception: org.granite.tide.spring.SpringValidatio
nException
at
org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.executeAction
(SimpleGrailsControllerHelper.java:250)
at
org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI
(SimpleGrailsControllerHelper.java:202)
at
org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI
(SimpleGrailsControllerHelper.java:137)
at
org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest
(SimpleGrailsController.java:88)
at
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle
(SimpleControllerHandlerAdapter.java:48)
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:597)
at
org.granite.messaging.service.ServiceInvocationContext.invoke
(ServiceInvocationContext.java:71)
at
org.granite.grails.integration.GrailsSecurityService.authorize
(GrailsSecurityService.java:81)
at org.granite.messaging.service.ServiceInvoker.invoke
(ServiceInvoker.java:144)
at
org.granite.messaging.amf.process.AMF3MessageProcessor.processRemotingMessage
(AMF3MessageProcessor.java:136)
at
org.granite.messaging.amf.process.AMF3MessageProcessor.process
(AMF3MessageProcessor.java:59)
at
org.granite.messaging.amf.process.AMF0MessageProcessor.process
(AMF0MessageProcessor.java:78)
at org.granite.messaging.webapp.AMFMessageServlet.doPost
(AMFMessageServlet.java:59)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
820)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.processFilterChain
(UrlMappingsFilter.java:282)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal
(UrlMappingsFilter.java:211)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at org.granite.messaging.webapp.AMFMessageFilter.doFilter
(AMFMessageFilter.java:100)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent
(GrailsPageFilter.java:249)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter
(GrailsPageFilter.java:140)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal
(GrailsReloadServletFilter.java:101)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal
(GrailsWebRequestFilter.java:65)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal
(HiddenHttpMethodFilter.java:63)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal
(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter
(OncePerRequestFilter.java:76)
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate
(DelegatingFilterProxy.java:237)
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter
(DelegatingFilterProxy.java:167)
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:233)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process
(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run
(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.codehaus.groovy.runtime.InvokerInvocationException:
org.granite.tide.spring.SpringValidationException
at
org.granite.messaging.service.ServiceInvocationContext.invoke
(ServiceInvocationContext.java:71)
at
org.granite.grails.integration.GrailsSecurityService.authorize
(GrailsSecurityService.java:81)
at org.granite.messaging.service.ServiceInvoker.invoke
(ServiceInvoker.java:144)
at
org.granite.messaging.amf.process.AMF3MessageProcessor.processRemotingMessage
(AMF3MessageProcessor.java:136)
at
org.granite.messaging.amf.process.AMF3MessageProcessor.process
(AMF3MessageProcessor.java:59)
at
org.granite.messaging.amf.process.AMF0MessageProcessor.process
(AMF0MessageProcessor.java:78)
at org.granite.messaging.webapp.AMFMessageServlet.doPost
(AMFMessageServlet.java:59)
at org.granite.messaging.webapp.AMFMessageFilter.doFilter
(AMFMessageFilter.java:100)
... 1 more
Caused by: org.granite.tide.spring.SpringValidationException
at BookController$_closure12.doCall(BookController:167)
at BookController$_closure12.doCall(BookController)
... 9 more

tue2551

unread,
Feb 4, 2010, 12:08:12 AM2/4/10
to กลุ่มผู้ใช้เกรลส์ในไทย

On Feb 1, 12:36 pm, tue2551 <mnk2...@gmail.com> wrote:
> ผมลองลง plugin activmq และ jms ตามนี้แล้วครับ...
>
> แต่เกิด error เวลา flex เรียกข้อมูล remote Object
> ขึ้นแบบนี้ยาวเลยครับ...
> ...แต่ถ้าเราไม่ใช้การทำงานผ่าน jms กรณีที่ server ต้องแจ้งอะไรไปหา
> Client ก็ไม่มี error อะไรครับ.
> ...ตอนนี้ผมก็ใช้แบบไม่ผ่าน jms ไปก่อนได้ครับ.
> ...แต่ส่งสัยว่าในตัวอย่างเค้าทำได้ไง อาจจะใช้กับ Grails ต่าง version
> กันไม่ได้หรือเปล่าครับ.

----------------------------------------------------------------
กรณีนี้ plugin flex และใช้ jms
ผมทราบสาเหตุที่ทำให้เกิดปัญหาแล้วครับ...
...คือปัญหาไม่ได้เกี่ยวกับ jms และ remote object อย่างที่ผมเข้าใจ
แต่เกิดจากใน web ที่เค้าสร้าง domain class แบบใช้ List และใช้ fetch
eager
พอแก้ไขเป็น แบบนี้ก็ใช้ได้ไม่มี Error แล้วครับ.
class Person implements Serializable {
String firstName
static hasMany = [addresses:Address]
static mapping = {
addresses lazy:false
}
}

แบบเดิมที่ทำให้เกิด error...
class Person implements Serializable {

String firstName
String lastName

List addresses

static hasMany = [addresses:Address]
static fetchMode = [addresses:"eager"]
}

ส่วนกรณีถ้ดไปข้างล่าง plugin graniteds ผมกำทดลองกับ Grails 1.2.1
ที่ออกมาใหม่ดูอีกทีว่าจะหายหรือไม่ครับ.
----------------------------------------------------------------

juacompe

unread,
Mar 19, 2010, 3:38:10 AM3/19/10
to กลุ่มผู้ใช้เกรลส์ในไทย
อันนี้เป็น common error ที่ผู้ใช้ ORM framework มักจะเจอไม่ว่าจะใช้
Hibernate, JPA หรือ GORM ก็ตาม คือการเอา object ออกไปใช้นอก container
ครับ

ที่น่าสงสัยคือ มันจะออกไปนอก container เมื่อไหร่? เมื่อเรา serialize
มันจาก server side ส่งออกไป client side ครับ จะทำให้ lazy load
เกิดปัญหา สาเหตุเพราะ lazy load คือการหลีกเลี่ยงการโหลด object
ออกมาทั้งยวง (เพราะเมื่อก่อนตอนไม่ทำ lazy load พอ domain model design
มาแล้วมี coupling สูง ผลคือ load ตัวนึงก็ต้องไป load ตัวถัดๆไป
แล้วสุดท้ายออกมาเกือบหมด database ตั้งแต่ object แรก) แต่พอ lazy แล้ว
เราต้องมั่นใจว่าทุกตัวที่เราจะใช้ เราโหลดให้เสร็จทั้งยวงของ return
ออกไปให้ client ครับ

ทีนี้เราจะควบคุมการ load อย่างไร วิธีมักง่ายๆ คือการ get property
ซักตัวของลูกตั้งแต่อยู่ใน server side พอเราจะ get ตอนนั้น session ยัง
sync. กับ database connection อยู่ จะไม่เกิด exception ครับ (ถ้าลูกมี
link ไป ก็ต้อง get property ตัวต่อไปอีก) การควบคุมการ load
ตรงนี้มีปัญหาระยะยาวคือ เรียก business method นึง ก็มี policy การ load
แบบนึง เด๋วก็โหลดบ้าง ไม่โหลดบ้าง ปวดหัว

อีกวิธีที่ดีกว่าในระยะยาวคือการกลับมา revise design ว่าอันไหนบ้าง
เป็นความสัมพันธ์หนาแน่น อันไหนเบาบาง ซึ่งถ้าเป็น case ที่หนาแน่น
ก็กำหนด fetchMode เป็น eager ซะ ส่วนที่เหลือก็คงให้ lazy ไว้แบบ
default วิธีนี้จะยากว่า เพราะมันมองให้ออกยากว่าตรงไหนควรหนาแน่น
ตรงไหนควรเบาบาง ยิ่งระบบพัฒนาไปเรื่อย
ความสัมพันธ์ที่เคยเบาบางกว่าอาจจะกลับมาหนาแน่นกว่าก็ได้
ทำให้ต้องเปลี่ยนเส้นที่เคย lazy เป็น eager แล้วกลับไปเปลี่ยนเส้นที่เคย
eager ให้กลับมา lazy

ฟังดูปวดหัวนะครับ แต่มันเป็นปัญหาที่หนีไม่พ้นครับ ลองทำให้ eager ไปหมด
วันนี้แก้ปัญหาได้ พอ deploy จริงก็จะเจอเรื่อง performance อยู่ดี
แล้วก็ต้องมา fine-tune กันอีกครับ

โชคดีครับ! ^ ^

tue2551

unread,
Mar 31, 2010, 12:42:56 AM3/31/10
to กลุ่มผู้ใช้เกรลส์ในไทย
ขอบคุณ คุณ juacompe มากเลยครับ...
...ได้ความรู้ และเข้าใจเพิ่มขึ้นเยอะเลยครับ.

Chokchai Phatharamalai

unread,
Apr 1, 2010, 12:56:28 PM4/1/10
to thai-gra...@googlegroups.com
ยินดีครับ ^ ^ ขออภัยที่มาตอบช้า ยังไม่ค่อยได้เช็คบ่อยๆ ^ ^"

2010/3/31 tue2551 <mnk...@gmail.com>
--
To unsubscribe, reply using "remove me" as the subject.



--
Chokchai Phatharamalai
Program Officer, Professional Master's in Software Engineering
Computer Science and Information Management
Asian Institute of Technology


Reply all
Reply to author
Forward
0 new messages