Java WebServiceException: Undefined port type with

2019-08-01 16:29发布

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

4条回答
甜甜的少女心
2楼-- · 2019-08-01 17:23

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);
查看更多
Anthone
3楼-- · 2019-08-01 17:26

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();     
    }       
}   
查看更多
smile是对你的礼貌
4楼-- · 2019-08-01 17:29

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.

查看更多
再贱就再见
5楼-- · 2019-08-01 17:30

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

查看更多
登录 后发表回答