2009-09-17 6 views
5

मेरे पास टॉमकैट पर तैनात एक राज्यव्यापी वेब सेवा है। इसमें फैक्ट्री सेवा और मुख्य एपीआई सेवा शामिल है, और यह ठीक काम करता है। फैक्टरी सेवा मुख्य API इंस्टेंस के लिए W3CEndpoint संदर्भ देता है, और क्लाइंट सत्र का उपयोग करता है।जेएक्स-डब्ल्यूएस: राज्यव्यापी डब्ल्यूएस एक स्टैंडअलोन प्रक्रिया में विफल रहता है

अब, मैं एकमात्र सेवा को एक स्टैंडअलोन एप्लिकेशन के रूप में चलाने की कोशिश कर रहा हूं। इस मामले में, कारखाने द्वारा वापस W3CEndpointReference अचानक कारखाना यूआरआई को इंगित करना शुरू करता है, मुख्य सेवा के लिए नहीं।

जब टोमकैट और स्टैंडअलोन के खिलाफ रनों के संदर्भों की तुलना की जाती है, तो यह स्पष्ट हो जाता है कि स्टैंडअलोन संदर्भ में गलत यूआरआई है। विशेष रूप से, यह फैक्टरी यूआरआई को इंगित करता है, मुख्य एपीआई नहीं।

<Address>http://localhost:9009/td2ws/factory</Address> 

मेरे समझ सर्वलेट संदर्भ के तहत कुछ कोड सेवा वर्ग के बीच पत्राचार का ज्ञान है कि (Td2Ws:

... 
<ns3:Address>http://localhost:8080/td2ws/api</ns3:Address> 
... 

यहाँ संदर्भ है जब कारखाने स्टैंडअलोन प्रक्रिया पर कहा जाता है:

यहाँ सही संदर्भ है) और यह यूआरआई है, और इसके अनुसार संदर्भ समायोजित करता है। हालांकि कोड का वह टुकड़ा स्टैंडअलोन प्रक्रिया के तहत प्रभावी नहीं है। मुझे यह भी संदेह हो सकता है कि कोड sun-jaxws.xml का उपयोग करता है, लेकिन मुझे नहीं पता कि इसे कैसे चालू करें "।

मैं स्टैंडअलोन एप्लिकेशन काम में राज्यव्यापी वेब सेवा कैसे बना सकता हूं?

फैक्टरी सेवा (स्टेटलेस):

@WebService(targetNamespace="http://server.td2ws.sf.net/") 
public class Td2WsFactory { 
    @WebMethod(operationName="StartSession", action="urn:StartSession") 
    @WebResult(name="Reference") 
    public W3CEndpointReference startSession() { 
     StatefulWebServiceManager<Td2Ws> manager = Td2Ws.getManager(); 

     // for standalone execution only 
     if(manager == null) { 
      manager = new StatefulInstanceResolver<Td2Ws>(Td2Ws.class); 
      Td2Ws.setManager(manager); 
     } 

     Td2Ws session = new Td2Ws(); 
     return manager.export(W3CEndpointReference.class,session); 
    } 
} 

स्टेटफुल एपीआई:

@Stateful 
@WebService(targetNamespace="http://server.td2ws.sf.net/") 
@Addressing 
public class Td2Ws { 
    private static StatefulWebServiceManager<Td2Ws> manager; 

    public static void setManager(StatefulWebServiceManager<Td2Ws> manager) { 
     Td2Ws.manager = manager; 
    } 

    public static StatefulWebServiceManager<Td2Ws> getManager() { 
     return Td2Ws.manager; 
    } 

    @WebMethod(operationName="Login", action="urn:Login") 
    public void login(
      @WebParam(name="Username") String username, 
      @WebParam(name="Password") String password, 
      @WebParam(name="Domain") String domain, 
      @WebParam(name="Project") String project 
      ) throws Td2WsException { 

क्लाइंट कोड (स्टैंडअलोन के लिए लक्षित):

यहाँ कोड के प्रासंगिक भागों रहे हैं

public static void main(String[] args) throws Exception { 
    Endpoint epf = Endpoint.publish("http://localhost:9009/td2ws/factory", new net.sf.td2ws.server.Td2WsFactory()); 
    Endpoint eps = Endpoint.publish("http://localhost:9009/td2ws/api", new net.sf.td2ws.server.Td2Ws()); 

    URL factoryUrl = new URL("http://localhost:9009/td2ws/factory?wsdl"); 
    QName factoryQname = new QName("http://server.td2ws.sf.net/", "Td2WsFactoryService"); 

    URL sessionUrl = new URL("http://localhost:9009/td2ws/api?wsdl"); 
    QName sessionQname = new QName("http://server.td2ws.sf.net/", "Td2WsService"); 

    Td2WsFactory factory = new Td2WsFactoryService(factoryUrl,factoryQname).getTd2WsFactoryPort(); 
    System.out.println("factory: "+factory); 

    W3CEndpointReference session = factory.startSession(); 
    System.out.println("session: "+session); 

    Td2WsService service = new Td2WsService(sessionUrl,sessionQname); 
    System.out.println("service: "+service); 

    Td2Ws port = service.getPort(session,Td2Ws.class); 
    System.out.println("port: "+port); 

    port.login(
      Config.get("td.user"), 
      Config.get("td.pass"), 
      Config.get("td.domain"), 
      Config.get("td.project")); 
    System.out.println("logged in..."); 

कि कोड प्रवेश पर विफल रहता है() लक्ष्य वस्तु कोई लॉग इन आपरेशन (यह गलत तरीके से सब के बाद, कारखाने यूआरआई पर लक्षित है) के रूप में:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 
Cannot find dispatch method for {http://server.td2ws.sf.net/}Login 

उत्तर

0

मैं इस थोड़ी देर में नहीं किया है, लेकिन मैं एक दृष्टि डाली एक कार्यात्मक राज्यव्यापी वेब सेवा पर जिसे मैंने कुछ समय पहले बनाया था। मेरे एनोटेशन, बहुत मिलते-जुलते को छोड़कर मैं अपने वर्ग के शीर्ष पर इस राशि:

public class MyService { 

    @Resource 
    WebServiceContext wsCtx; 

    ... 

} 

सूचना वहाँ कोई संशोधक है, अगर किसी और मैं इसे सार्वजनिक करने की जरूरत है लगता है, लेकिन मैं सकारात्मक नहीं कर रहा हूँ कुछ भी। यह कंटेनर कैसे सेट करता है यह मुझे धड़कता है, लेकिन यह काम करता है। इसे किसी भी @Resource प्रकार WebServiceContext के लिए देखना चाहिए और इसे सेट करना होगा। आप सत्र की जानकारी तक पहुंच सकते हैं:

HttpServletRequest hRequest = (HttpServletRequest)ctx.getMessageContext().get(MessageContext.SERVLET_REQUEST); 

Session s = hRequest.getSession(); 
+0

प्रश्न में सेवा स्टैंडअलोन है, यानी एक सर्वलेट कंटेनर के भीतर नहीं चल रहा है। –

संबंधित मुद्दे