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

        

Reply via email to