2009-03-18 10 views
0

Je suis nouveau sur les services Web avec JBoss. Un client se connecte à un service Web basé sur EJB3 Avec JBoss AS 5 et JDK 6 utilisant JAX-WS. Je suis coincé à l'exception suivante:Java WebServiceException: type de port non défini avec 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 est un projet différent de celui 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; 
    } 
} 

Répondre

-1

Essayez d'utiliser cette méthode:

//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

essayer d'ajouter:
-Djava.endorsed.dirs = $ {} jbossHome/lib/endorsed/
comme argument vm lorsque vous exécutez BeanWSClient. (où jbossHome est bien sûr votre maison de jboss). Le problème était, pour autant que je me souvienne, de surcharger l'implémentation de WSService au soleil, et vous devez définir le chargement de la classe pour charger l'implémentation de jboss avant l'implémentation du soleil.
étant donné que l'implémentation de sun est dans rt.jar, vous devez utiliser lib.

2

Ajoutez endpointInterface dans l'annotation @WebSevice, si vous ne mentionnez pas l'interface de noeud final, indiquez le nom complet du port lors de l'utilisation de la méthode getPort.

1

En HelloWorld.java, vous devez modifier le paramètre name = "EndpointInterface" de l'annotation @WebService-name = "HelloRemote"

OU

En BeanWSClient.java, dans la méthode getPort(String endpointURI), remplacer

return service.getPort(HelloRemote.class); 

avec

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