[ 
https://issues.apache.org/jira/browse/CXF-8450?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Freeman Yue Fang updated CXF-8450:
----------------------------------
    Summary: Make JAXBDatabinding extendable  (was: Cached JAXB databinding )

> Make JAXBDatabinding extendable
> -------------------------------
>
>                 Key: CXF-8450
>                 URL: https://issues.apache.org/jira/browse/CXF-8450
>             Project: CXF
>          Issue Type: New Feature
>          Components: JAXB Databinding
>            Reporter: Mantas Gridinas
>            Assignee: Freeman Yue Fang
>            Priority: Minor
>         Attachments: 
> Creates_a_reordered_JAXBDataBinding_implementation_that_permits_expanding_internal_class_l.patch
>
>
> Background: we use CXF 3.3.9 via apache camel 2.25
> Our internal system provides single WSDL file every release which contains 
> roughly 30 interfaces and produces about 3.2K classes. When using regular 
> JAXBDatabinding implementation we found that it rescans the classes every 
> time we attempt to create one of those interfaces endpoint when we use new 
> instances of JAXBDatabinding. When we reuse an existing instance of 
> JAXBDatabinding, there's a check in it that prevents expanding the class list 
> in existing context:
> {code:java}
> // context is already set, don't redo it
> if (context != null) {
>     return;
> }
> {code}
> and as a result, it crashes with the following error
> {code:java}
> org.apache.camel.RuntimeCamelException: 
> org.apache.cxf.service.factory.ServiceConstructionException: Service class 
> se.foo.schemas.bar.webservices.wsdl.BenefitInterface method getBenefit part 
> {http://schemas.foo.se/bar/WebServices/wsdl}request cannot be mapped to 
> schema. Check for use of a JAX-WS-specific type without the JAX-WS service 
> factory bean.
>       at 
> org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1826)
>       at 
> org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:136)
>       at 
> org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:174)
>       at 
> org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
>       at 
> org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
>       at 
> org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
>       at 
> org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:398)
>       at 
> org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:355)
>       at 
> org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882)
>       at 
> org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163)
>       at 
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
>       at 
> org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
>       at 
> org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
>       at 
> org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
>       at 
> org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
>       at 
> org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
>       at 
> org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
>       at 
> se.internal.integration.bar.configuration.IntegrationBarApplication.main(IntegrationBarApplication.java:22)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>       at 
> org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
> Caused by: org.apache.cxf.service.factory.ServiceConstructionException: 
> Service class se.foo.schemas.bar.webservices.wsdl.BenefitInterface method 
> getBenefit part {http://schemas.foo.se/bar/WebServices/wsdl}request cannot be 
> mapped to schema. Check for use of a JAX-WS-specific type without the JAX-WS 
> service factory bean.
>       at 
> org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.createBareMessage(ReflectionServiceFactoryBean.java:1266)
>       at 
> org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:479)
>       at 
> org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:693)
>       at 
> org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:529)
>       at 
> org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:262)
>       at 
> org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:199)
>       at 
> org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:103)
>       at 
> org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91)
>       at 
> org.apache.camel.component.cxf.CxfEndpoint.createClient(CxfEndpoint.java:649)
>       at 
> org.apache.camel.component.cxf.CxfProducer.doStart(CxfProducer.java:84)
>       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
>       at 
> org.apache.camel.impl.SynchronousDelegateProducer.start(SynchronousDelegateProducer.java:66)
>       at 
> org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
>       at 
> org.apache.camel.impl.DeferServiceStartupListener.onCamelContextStarted(DeferServiceStartupListener.java:49)
>       at 
> org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3868)
>       at 
> org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3647)
>       at 
> org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3488)
>       at 
> org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3247)
>       at 
> org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3243)
>       at 
> org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3266)
>       at 
> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3243)
>       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
>       at 
> org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3159)
>       at 
> org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:133)
>       ... 21 common frames omitted
> {code}
> I've attached the changes patch that would be made to existing 
> JAXBDatabinding class to support the expanding internal cache. I'm sure that 
> the cachedjaxbdatabinding breaks some existing concerns.
>  
> Looking through existing tests that refer to JAXBDatabinding class it seems I 
> would have to duplicate quite a few of them. Is there a TCK that could be 
> used for JAXBDatabinding implementations instead?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to