2009-03-18 6 views
0

Ich bin neu in Web Services mit JBoss. Ein Client verbindet sich mit einem EJB3-basierten Web-Service mit JBoss AS 5 und JDK 6 mit JAX-WS. Ich bin mit der folgenden Ausnahme fest:Java WebServiceException: Nicht definierter Porttyp mit JBoss

Exception in thread "main" javax.xml.ws.WebServiceException: 
Undefined port type: {http://webservice.samples/}HelloRemote 
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:300) 
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:306) 
at javax.xml.ws.Service.getPort(Service.java:161) 
at samples.client.BeanWSClient.getPort(BeanWSClient.java:44) 
at samples.client.BeanWSClient.main(BeanWSClient.java:35) 

BeanWSClient.java (Client ist ein anderes Projekt als EJB3 WS):

package samples.client; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.xml.namespace.QName; 
import javax.xml.ws.Service; 
import samples.webservice.HelloRemote; 

public class BeanWSClient { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws Exception { 
     String endpointURI ="http://192.168.22.100:8080/SampleWSEJBProject/HelloWorld?wsdl"; 
     String helloWorld = "Hello world!"; 
     Object retObj = getPort(endpointURI).echo(helloWorld); 
     System.out.println(retObj); 
    } 

    private static HelloRemote getPort(String endpointURI) throws MalformedURLException { 
     QName serviceName = new QName("http://www.openuri.org/2004/04/HelloWorld", "HelloWorldService"); 
     URL wsdlURL = new URL(endpointURI); 
     Service service = Service.create(wsdlURL, serviceName); 
     return service.getPort(HelloRemote.class); 
    } 

HelloRemote.java:

package samples.webservice; 
import javax.jws.WebService; 

@WebService 
//@SOAPBinding(style=SOAPBinding.Style.RPC) 
public interface HelloRemote { 
    public String echo(String input); 
} 

HelloWorld.java :

package samples.webservice; 

import javax.ejb.Remote; 
import javax.ejb.Stateless; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 
import javax.jws.soap.SOAPBinding; 

/** 
* Session Bean implementation class MyBean 
*/ 
@WebService(name = "EndpointInterface", targetNamespace = "http://www.openuri.org/2004/04/HelloWorld", serviceName = "HelloWorldService") 
@SOAPBinding(style = SOAPBinding.Style.RPC) 
@Remote(HelloRemote.class) 
@Stateless 
public class HelloWorld implements HelloRemote { 
    /** 
    * @see Object#Object() 
    */ 
    @WebMethod 
    public String echo(String input) { 
     return input; 
    } 
} 

Antwort

-1

Versuchen Sie, diese Methode zu verwenden:

//inicia classe 
public void test(){ 
    String url = "http://localhost:8080/soujava_server/HelloWorld?wsdl"; 
    // Create an instance of HttpClient. 
    HttpClient client = new HttpClient(); 

    // Create a method instance. 
    GetMethod method = new GetMethod(url); 

    // Provide custom retry handler is necessary 
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false)); 

    try { 
     // Execute the method. 
     int statusCode = client.executeMethod(method); 

     if (statusCode != HttpStatus.SC_OK) { 
     System.err.println("Method failed: " + method.getStatusLine()); 
     } 

     // Read the response body. 
     byte[] responseBody = method.getResponseBody(); 

     // Deal with the response. 
     // Use caution: ensure correct character encoding and is not binary data 
     System.out.println(new String(responseBody)); 

    } catch (HttpException e) { 
    System.err.println("Fatal protocol violation: " + e.getMessage()); 
    e.printStackTrace(); 
    } catch (IOException e) { 
    System.err.println("Fatal transport error: " + e.getMessage()); 
    e.printStackTrace(); 
    } finally { 
    // Release the connection. 
    method.releaseConnection();  
    }  
} 
0

Versuchen Sie:
-Djava.endorsed.dirs = $ {jbossHome}/lib/endorsed/
als vm Argument, wenn Sie BeanWSClient ausführen. (wo jbossHome natürlich dein jboss zuhause ist).
Das Problem war, soweit ich mich erinnere, jboss die Sun-Implementierung von WSService überschrieben, und Sie müssen Ihre Klasse laden, um die jboss-Implementierung vor der Implementierung der Sonne zu laden.
Da die Implementierung von sun in rt.jar ist, müssen Sie die empfohlene lib verwenden.

2

Fügen Sie endpointInterface in @WebService Annotation hinzu, wenn Sie die Endpunktschnittstelle nicht erwähnen, geben Sie bei der Verwendung der getPort-Methode einen vollständig qualifizierten Portnamen ein.

1

In HelloWorld.java, sollten Sie die name = "EndpointInterface" Parameter der @WebService Anmerkung ändern name = "HelloRemote"

ODER

In BeanWSClient.java im getPort(String endpointURI) Methode ersetzen

return service.getPort(HelloRemote.class); 

mit

QName port_name = new QName("http://www.openuri.org/2004/04/HelloWorld","HelloWorldPort"); 
return service.getPort(port_name, HelloRemote.class); 
Verwandte Themen