views:

1226

answers:

2

I am new to Web Services with JBoss. A client is connecting to an EJB3 based Web Service With JBoss AS 5 and JDK 6 using JAX-WS. I am stuck with the following exception:

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 is a different project than 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;
    }
}
A: 

holly shit man....let me think about it...

try to use this method and tell me if it works rigth ?

//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();  
 }  
}
A: 

try adding:
-Djava.endorsed.dirs=${jbossHome}/lib/endorsed/
as a vm argument when you execute BeanWSClient. (where jbossHome is of-course your jboss home).
the problem was, as far as i recall, jboss overwritten the sun implementation of WSService, and you need to set your class loading to load the jboss implementation before the sun's implementation.
because sun's implementation is in rt.jar you need to use endorsed lib.

livnat peer