2016-03-22 16 views
7

पर webservice को प्रोग्रामेटिक रूप से प्रकाशित करने के लिए कैसे करें मैं एक webservice प्रोग्रामेटिक रूप से को टॉमकैट पर प्रकाशित करना चाहता हूं।
उदाहरण के साथ जेएक्स-डब्ल्यूएस या अपाचे सीएक्सएफ
Endpoint.publish(...) के समान।
टॉमकैट

//how to tell this tomcat? 
Endpoint.publish("http://0.0.0.0:8080/SimpleService", serviceImpl); 
//or better something like this: 
Endpoint.publish("/SimpleService", serviceImpl); 

web.xml और/या sun-jaxws.xml (प्रत्येक सेवा के लिए) का उपयोग करने

प्रश्न की जरूरत के बिना:
वहाँ इसे पूरा करने के लिए किसी भी ज्ञात तरीका है (JAX-WS या अपाचे CXF या साथ। ..)?

(मुझे पता है कि पहले से ही तैनात इसी तरह के सवाल कर रहे हैं। लेकिन उनमें से कोई भी वास्तव में मेरे सवाल का जवाब।)

+0

मुझे आपकी आवश्यकताओं के बारे में निश्चित नहीं है। आप टॉमकैट पर एक एप्लिकेशन को तैनात करना चाहते हैं (इसलिए आपको web.xml की आवश्यकता है) जो प्रोग्राम प्राप्त करने के लिए अनुरोध प्राप्त करने के लिए एक नया अंतराल प्रकाशित करते हैं। क्या यह सही है? – pedrofb

+0

टॉमकैट प्रबंधक वेब-ऐप का उपयोग एक नया वेब एप्लिकेशन (सही यूआरएल कॉल करके) को तैनात करने के लिए किया जा सकता है (https://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#Deploy_A_New_Application_from_a_Local_Path) – Maxx

उत्तर

1

यह मेरे अपने प्रश्न का anwer है।
मैं इस काम को बनाने में कामयाब रहा [अपाचे सीएक्सएफ की मदद से प्रोग्रामेटिक रूप से टॉमकैट पर webservice प्रकाशित करें।

मैं एक CXFNonSpringServlet subclassed और web.xml में यह पंजीकृत:

<servlet> 
<servlet-name>MyCXFServlet</servlet-name> 
<display-name>CXF Servlet</display-name> 
<servlet-class>de.test.MyCXFServlet</servlet-class> 
<load-on-startup>2</load-on-startup> 
<async-supported>true</async-supported> 
</servlet> 

<servlet-mapping> 
<servlet-name>MyCXFServlet</servlet-name> 
<url-pattern>/soap/*</url-pattern> 
</servlet-mapping> 

यह मेरा subclassed है CXFNonSpringServlet:

import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
import java.util.HashSet; 
import java.util.Set; 
import javax.jws.WebMethod; 
import javax.servlet.ServletConfig; 
import org.apache.cxf.endpoint.Server; 
import org.apache.cxf.frontend.ServerFactoryBean; 
import org.apache.cxf.service.factory.ReflectionServiceFactoryBean; 
import org.apache.cxf.transport.servlet.CXFNonSpringServlet; 

public class MyCXFServlet extends CXFNonSpringServlet 
{ 
    @Override 
    protected void loadBus(ServletConfig sc) 
    { 
     super.loadBus(sc); 
     publishServices(); 
    } 

    private void publishServices() 
    { 
     Set<Class> serviceInterfaces = new HashSet<>(); 
     serviceInterfaces.add(de.test.IUserService.class); 
     serviceInterfaces.add(de.test.ILoginService.class); 

     for (Class aSVCInterface : serviceInterfaces) 
     { 
      final String serviceName = aSVCInterface.getSimpleName(); 

      try 
      { 
       ReflectionServiceFactoryBean reflectionFactory = new ReflectionServiceFactoryBean(){ 
        @Override 
        protected boolean isValidMethod(Method method) 
        { 
         boolean ret = super.isValidMethod(method); 
         WebMethod wm = method.getAnnotation(WebMethod.class); 
         if (wm != null && wm.exclude()) 
          ret = false; 
         return ret; 
        } 

        @Override 
        protected String getServiceName() //Override for custom service name 
        { 
         return serviceName; 
        } 

       }; 
       reflectionFactory.setServiceClass(aSVCInterface); 

       Object proxiedServiceObject = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{aSVCInterface}, new de.test.MyWebServiceInvocationHandler(aSVCInterface)); 

       ServerFactoryBean factory = new ServerFactoryBean(reflectionFactory); 
       factory.setBus(getBus()); 
       factory.setServiceClass(aSVCInterface); 
       factory.setServiceBean(proxiedServiceObject); 
       factory.setAddress("/" + serviceName); 
       Server svr = factory.create();  
       svr.getEndpoint().getInInterceptors().add(new de.test.MyServiceInterceptor()); 
      } 
      catch (Exception exception) 
      { 
       exception.printStackTrace(); 
      } 
     } 
    } 
} 

ऊपर सर्वलेट जाएगा

यहाँ एक सरल काम कर उदाहरण है SOAP-WebService के रूप में 2 सरल इंटरफेस प्रकाशित करें।
कार्यान्वयन गतिशील है (प्रॉक्सी)

यह मेरा MyServiceInterceptor है:

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Proxy; 
import org.apache.cxf.binding.soap.SoapMessage; 
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; 
import org.apache.cxf.endpoint.Endpoint; 
import org.apache.cxf.interceptor.Fault; 
import org.apache.cxf.message.Exchange; 
import org.apache.cxf.phase.Phase; 
import org.apache.cxf.service.Service; 
import org.apache.cxf.service.invoker.BeanInvoker; 
import org.apache.cxf.service.invoker.Invoker; 

public class MyServiceInterceptor extends AbstractSoapInterceptor 
{ 
    public MyServiceInterceptor() 
    { 
     super(Phase.PRE_INVOKE); 
    } 

    @Override 
    public void handleMessage(SoapMessage p_message) throws Fault 
    { 
     final Exchange exchange = p_message.getExchange(); 
     final Endpoint endpoint = exchange.get(Endpoint.class); 
     final Service service = endpoint.getService(); 
     final Invoker invoker = service.getInvoker(); 

     if (invoker instanceof BeanInvoker) 
     { 
      BeanInvoker bi = (BeanInvoker)invoker; 
      Object serviceObj = bi.getServiceObject(null); 
      if (Proxy.isProxyClass(serviceObj.getClass())) 
      { 
       InvocationHandler ih = Proxy.getInvocationHandler(serviceObj); 
       if (ih instanceof MyWebServiceInvocationHandler) 
       { 
        MyWebServiceInvocationHandler h = (MyWebServiceInvocationHandler)ih; 
        h.setSoapMessage(p_message); 
       } 
      } 
     } 
    } 
} 

MyServiceInterceptor-क्लास मुख्य रूप से MyWebServiceInvocationHandler करने के लिए वर्तमान SOAPMessage इंजेक्षन किया जाता है।

मेरा MyWebServiceInvocationHandler (मुझे लगता है कि, यहां कोई कोड आवश्यक नहीं है) वास्तविक सेवा-विधि का आह्वान करने के लिए ज़िम्मेदार है। यह सिर्फ InvocationHandler लागू करता है और साबुन-संदेश के लिए एक फ़ील्ड है (MyServiceInterceptor देखें)। SOAPMessage-विवरण (हेडर की तरह) प्राप्त करने के लिए इसकी आवश्यकता है।

उम्मीद है कि इससे मदद मिलती है।
चीयर्स!