Excluded service methods not excluded in OSGi
---------------------------------------------
Key: CXF-3771
URL: https://issues.apache.org/jira/browse/CXF-3771
Project: CXF
Issue Type: Bug
Components: OSGi
Affects Versions: 2.4.2
Environment: Windows XP; ServiceMix (or Talend TSF)
Reporter: Barry Hathaway
I have a annotated web service consisting of an interface and an implementation
that works just fine under CXF running in a Tomcat container. When I try to
move it to an OSGi environment (either SMX or TSF) I get the exception below.
The problem seems to be that the 2 excluded methods getServiceNameMap and
setServiceNameMap are trying to get processed by JAXB when they should have
been excluded and only called by Spring at bean creation.
karaf@root> Exception in thread "SpringOsgiExtenderThread-6"
org.springframework.beans.factory.BeanCreationException: Error creating b
th name 'SadlService': Invocation of init method failed; nested exception is
javax.xml.ws.WebServiceException: org.apache.cxf.service.
y.ServiceConstructionException
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFact
va:1420)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactor
:519)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.
56)
at
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.ja
)
at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.j
5)
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutio
cationContext.java:69)
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionAppli
Context.java:355)
at
org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExec
pplicationContext.java:320)
at
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshT
n(DependencyWaiterApplicationContextExecutor.java:132)
at java.lang.Thread.run(Thread.java:662)
Caused by: javax.xml.ws.WebServiceException:
org.apache.cxf.service.factory.ServiceConstructionException
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:350)
at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:239)
at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:509)
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.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapable
ctory.java:1544)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanF
.java:1485)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFact
va:1417)
... 14 more
Caused by: org.apache.cxf.service.factory.ServiceConstructionException
at
org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:292)
at
org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:438)
at
org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:682)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:501)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:241)
at
org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:202)
at
org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at
org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:157)
at
org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:202)
at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:433)
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:322)
... 23 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of
IllegalAnnotationExceptions
java.util.Map is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at java.util.Map
at private java.util.Map
com.ge.research.sadl.sadlserver.cxf.provider.jaxws_asm.SetServiceNameMap.arg0
at
com.ge.research.sadl.sadlserver.cxf.provider.jaxws_asm.SetServiceNameMap
java.util.Map does not have a no-arg default constructor.
this problem is related to the following location:
at java.util.Map
at private java.util.Map
com.ge.research.sadl.sadlserver.cxf.provider.jaxws_asm.SetServiceNameMap.arg0
at
com.ge.research.sadl.sadlserver.cxf.provider.jaxws_asm.SetServiceNameMap
at
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
at
com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
at
com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
at
com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
at
com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
at
com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
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 javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:213)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:387)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:618)
at
org.apache.cxf.jaxb.JAXBContextCache.createContext(JAXBContextCache.java:258)
at
org.apache.cxf.jaxb.JAXBContextCache.getCachedContextAndSchemas(JAXBContextCache.java:167)
at
org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContextAndSchemas(JAXBDataBinding.java:418)
at
org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:290)
... 34 more
-------- Sample Code --------------
Interface file: ISadlServiceProvider.java
package com.ge.research.sadl.sadlserver.cxf.provider;
import java.util.List;
import java.util.Map;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* Interface of the SadlService which creates a SADL Server for use
* in a CXF environment.
*
* @author Barry Hathaway
*/
@WebService(name="SadlService",targetNamespace="http://sadlserver.sadl.research.ge.com")
public interface ISadlServiceProvider {
/**
* Gets the service name map which translates the service name into a
* knowledge base identifier and model name.
*
* @return Service name map
*/
public Map<String,String[]> getServiceNameMap();
/**
* Sets the service name map which translates the service name into a
* knowledge base identifier and model name.
*
* @param Service name map
*/
public void setServiceNameMap(Map<String,String[]> serviceNameMap);
/**
* Gets the SADL server implementation class name
*
* @return SadlServer class name
* @throws com.ge.research.sadl.sadlserver.SessionNotFoundException
*/
@WebMethod(operationName="getClassName", action="urn:getClassName")
public String getClassName();
}
-------------
Implementation file: SadlServiceProvider.java
package com.ge.research.sadl.sadlserver.cxf.provider;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.URLDataSource;
import javax.jws.WebMethod;
import javax.jws.WebService;
import org.apache.cxf.annotations.FactoryType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of the SadlService which creates a SADL Server for use
* in a CXF environment.
*
* @author Barry Hathaway
*/
@WebService(serviceName="SadlService",name="SadlService",targetNamespace="http://sadlserver.sadl.research.ge.com",endpointInterface="com.ge.research.sadl.sadlserver.cxf.provider.ISadlServiceProvider")
public class SadlServiceProvider implements ISadlServiceProvider {
private Logger logger = LoggerFactory.getLogger(getClass());
ISadlServer server = null;
public static final String SERVER = "server";
private Map<String,String[]> serviceNameMap = null;
/**
* Gets the service name map which translates the service name into a
* knowledge base identifier and model name.
*
* @return Service name map
*/
@WebMethod(exclude=true)
public Map<String,String[]> getServiceNameMap() {
return serviceNameMap;
}
/**
* Sets the service name map which translates the service name into a
* knowledge base identifier and model name.
*
* @param Service name map
*/
@WebMethod(exclude=true)
public void setServiceNameMap(Map<String,String[]> serviceNameMap) {
this.serviceNameMap = serviceNameMap;
Iterator<String> it = this.serviceNameMap.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
String[] val = this.serviceNameMap.get(key);
logger.debug("ServiceNameMap: "+ key +" = "+ val[0] +"
: "+ val[1]);
}
this.server.setServiceNameMap(serviceNameMap);
}
/**
* Default constructor
*/
public SadlServiceProvider() {
logger.debug("constructor called");
// this.server = new SadlServerImpl();
}
/**
* Gets the SADL server implementation class name
*
* @return SadlServer class name
* @throws com.ge.research.sadl.sadlserver.SessionNotFoundException
*/
public String getClassName() {
return this.getClass().getName();
}
}
-----
beans.xml file
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<!-- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"
/> -->
<!-- <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> -->
<import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml" />
<bean id="sadlServiceProvider" scope="session"
class="com.ge.research.sadl.sadlserver.cxf.provider.SadlServiceProvider">
<aop:scoped-proxy/>
<property name="serviceNameMap">
<map>
<entry key="cfm56_7_top">
<list>
<value>D:\projects\SADL\SadlServerV2Standalone\DataModels\InScope</value>
<value>http://ctp.geae.ge.com/iws/cfm56_7_top</value>
</list>
</entry>
<entry key="cfm56-7_full_test1">
<list>
<value>D:\projects\SADL\SadlServerV2Standalone\DataModels\InScope</value>
<value>http://ctp.geae.ge.com/iws/cfm56-7_full_test1</value>
</list>
</entry>
<entry key="shapes_test">
<list>
<value>D:\projects\SADL\SadlServerV2Standalone\DataModels\ShapesDemo</value>
<value>http://sadl.imp/shapes_test</value>
</list>
</entry>
<entry key="shapes_rules">
<list>
<value>D:\projects\SADL\SadlServerV2Standalone\DataModels\ShapesDemo</value>
<value>http://sadl.imp/shape_rules</value>
</list>
</entry>
</map>
</property>
</bean>
<jaxws:endpoint
id="SadlService"
implementor="#sadlServiceProvider"
address="/SadlService" />
</beans>
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira