abcd1234
abcd1234

Reputation:

Java WebServiceException: Undefined port type with JBoss

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;
    }
}

Upvotes: 2

Views: 10673

Answers (4)

MrCelticFox
MrCelticFox

Reputation: 51

In HelloWorld.java, you should change the name = "EndpointInterface" parameter of the @WebService annotation to name = "HelloRemote"

OR

In BeanWSClient.java, in the getPort(String endpointURI) method, replace

return service.getPort(HelloRemote.class);  

with

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

Upvotes: 3

anil kumar
anil kumar

Reputation: 91

add endpointInterface in @WebSevice annotation, if you dont mention endpoint interface give fully qualified portname while using getPort method.

Upvotes: 2

Reputation:

Try to use this method:

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

Upvotes: -1

livnat peer
livnat peer

Reputation: 116

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.

Upvotes: 0

Related Questions