[ 
https://issues.apache.org/jira/browse/CAMEL-4780?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13170152#comment-13170152
 ] 

Willem Jiang commented on CAMEL-4780:
-------------------------------------

I don't think it is bug, we should avoid adding two type converter class to be 
load at the same time.
There are some improvement about the speed up the type converter loading the 
Camel 2.8 which let the XmlToScalaNode$ be loaded as converter.
As you know the XmlToScalaNode$ has no public method to create the instance to 
implement the singleton pattern, we should avoid the 
AnnotationTypeConverterLoader to load it, and you already find a way to archive 
it :)

I'm heading to add a FAQ entry in the Camel.

                
> ObjectHelper can not access a member of class 
> com.db.fi.camel.scala.XmlToScalaNode$ with modifiers "private"
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-4780
>                 URL: https://issues.apache.org/jira/browse/CAMEL-4780
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core, camel-scala
>    Affects Versions: 2.8.3
>         Environment: Java 1.6, Scala 2.9.1, Camel 2.8.3
>            Reporter: Craig McDaniel
>            Priority: Minor
>         Attachments: XmlToScalaNode.scala
>
>
> The ObjectHelper is choking on a TypeConverter written in Scala. Two classes 
> are compiled by Scala for singleton objects: XmlToScalaNode and 
> XmlToScalaNode$
> Here is the TypeConverter code:
> {quote}
> import scala.xml.XML
> import scala.xml.Elem
> import org.apache.camel.Converter
> import org.apache.camel.converter.jaxp.XmlConverter
> import org.w3c.dom.Node
> import org.w3c.dom.Element
> @Converter object XmlToScalaNode {
>     
>     //val converter = new XmlConverter()
>     
>     @Converter
>     def convert(xml: String) = XML.loadString(xml)
>     
>     @Converter
>     def convert(elem: Node): Elem = convert(new XmlConverter().toString(elem, 
> null))
>     
>     @Converter
>     def convert(elem: Element): Elem = convert(new 
> XmlConverter().toString(elem, null))
> }
> {quote}
> The root cause appears to be:
> {quote}Caused by: java.lang.IllegalAccessException: Class 
> org.apache.camel.util.ObjectHelper can not access a member of class 
> com.db.fi.camel.scala.XmlToScalaNode$ with modifiers "private"{quote}
> This was working just fine with camel 2.7.3. As a workaround, I had to use 
> the full class name for XmlToScalaNode in my TypeConverter file in META-INF. 
> Using just the package name caused the error. My guess is that the annotation 
> is existing on both classes and some change in ObjectHelper is now more 
> strict with the XmlToScalaNode$ class.
> Here is the full stack trace:
> {quote}Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.704 
> sec <<< FAILURE!
> testSplitConversion(com.db.fi.camel.XpathSplitterTest)  Time elapsed: 0.691 
> sec  <<< ERROR!
> org.apache.camel.CamelExecutionException: Exception occurred during execution 
> on the exchange: Exchange[Message: <b>bar</b>]
>       at 
> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1180)
>       at 
> org.apache.camel.builder.ExpressionBuilder$33.evaluate(ExpressionBuilder.java:814)
>       at 
> org.apache.camel.impl.ExpressionAdapter.evaluate(ExpressionAdapter.java:36)
>       at 
> org.apache.camel.component.bean.MethodInfo$2.evaluate(MethodInfo.java:371)
>       at 
> org.apache.camel.component.bean.MethodInfo.createMethodInvocation(MethodInfo.java:204)
>       at 
> org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:204)
>       at 
> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:151)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>       at 
> org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:162)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>       at org.apache.camel.processor.interceptor.Debug$1.process(Debug.java:50)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
>       at 
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:306)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at org.apache.camel.processor.Pipeline.process(Pipeline.java:116)
>       at org.apache.camel.processor.Pipeline.process(Pipeline.java:79)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
>       at 
> org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:139)
>       at 
> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:106)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:572)
>       at 
> org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:505)
>       at 
> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:218)
>       at org.apache.camel.processor.Splitter.process(Splitter.java:96)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>       at 
> org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:162)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>       at org.apache.camel.processor.interceptor.Debug$1.process(Debug.java:50)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
>       at 
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:306)
>       at 
> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:111)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>       at 
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>       at 
> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:61)
>       at 
> org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:139)
>       at 
> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:106)
>       at 
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:104)
>       at 
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85)
>       at 
> org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:63)
>       at 
> org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:351)
>       at 
> org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:323)
>       at 
> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:222)
>       at 
> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:323)
>       at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:168)
>       at 
> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:110)
>       at 
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:123)
>       at 
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:130)
>       at 
> com.db.fi.camel.XpathSplitterTest.testSplitConversion(XpathSplitterTest.scala:30)
>       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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>       at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>       at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>       at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>       at 
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>       at 
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
>       at org.junit.rules.TestWatchman$1.evaluate(TestWatchman.java:48)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
>       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>       at 
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
>       at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>       at 
> org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
>       at 
> org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
>       at 
> org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
>       at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
>       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.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
>       at 
> org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
> Caused by: org.apache.camel.InvalidPayloadException: No body available of 
> type: scala.xml.Elem but has value: [b: null] of type: 
> com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl on: Message: 
> <b>bar</b>. Caused by: No type converter available to convert from type: 
> com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl to the required 
> type: scala.xml.Elem with value [b: null]. Exchange[Message: <b>bar</b>]. 
> Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type 
> converter available to convert from type: 
> com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl to the required 
> type: scala.xml.Elem with value [b: null]]
>       at 
> org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:102)
>       at 
> org.apache.camel.builder.ExpressionBuilder$33.evaluate(ExpressionBuilder.java:812)
>       ... 94 more
> Caused by: org.apache.camel.NoTypeConversionAvailableException: No type 
> converter available to convert from type: 
> com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl to the required 
> type: scala.xml.Elem with value [b: null]
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:140)
>       at 
> org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:100)
>       ... 95 more
> Caused by: org.apache.camel.RuntimeCamelException: 
> java.lang.IllegalAccessException: Class org.apache.camel.util.ObjectHelper 
> can not access a member of class com.db.fi.camel.scala.XmlToScalaNode$ with 
> modifiers "private"
>       at 
> org.apache.camel.util.ObjectHelper.newInstance(ObjectHelper.java:1066)
>       at 
> org.apache.camel.util.ReflectionInjector.newInstance(ReflectionInjector.java:32)
>       at 
> org.apache.camel.impl.converter.CachingInjector.createInstance(CachingInjector.java:44)
>       at 
> org.apache.camel.impl.converter.CachingInjector.newInstance(CachingInjector.java:38)
>       at 
> org.apache.camel.impl.converter.InstanceMethodTypeConverter.convertTo(InstanceMethodTypeConverter.java:58)
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:182)
>       at 
> org.apache.camel.impl.converter.LazyLoadingTypeConverter.doConvertTo(LazyLoadingTypeConverter.java:47)
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:138)
>       ... 96 more
> Caused by: java.lang.IllegalAccessException: Class 
> org.apache.camel.util.ObjectHelper can not access a member of class 
> com.db.fi.camel.scala.XmlToScalaNode$ with modifiers "private"
>       at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
>       at java.lang.Class.newInstance0(Class.java:349)
>       at java.lang.Class.newInstance(Class.java:308)
>       at 
> org.apache.camel.util.ObjectHelper.newInstance(ObjectHelper.java:1062)
>       ... 103 more{quote}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to