Java WebServiceException:JBoss未定义端口类型

Java WebServiceException:JBoss未定义端口类型,java,web-services,jboss,Java,Web Services,Jboss,我不熟悉JBoss的Web服务。客户端正在连接到基于EJB3的Web服务 使用JBossAS5和使用JAX-WS的JDK6。我遇到以下例外情况: Exception in thread "main" javax.xml.ws.WebServiceException: Undefined port type: {http://webservice.samples/}HelloRemote at com.sun.xml.internal.ws.client.WSServiceDelegate.get

我不熟悉JBoss的Web服务。客户端正在连接到基于EJB3的Web服务 使用JBossAS5和使用JAX-WS的JDK6。我遇到以下例外情况:

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(客户端与EJB3 WS是不同的项目):

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

尝试使用以下方法:

//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();     
    }       
}   
尝试添加:
-Djava.annowed.dirs=${jbossHome}/lib/annowed/
当您执行BeanWSClient时,将其作为vm参数。(jbossHome当然是您的jbossHome)。
问题是,据我回忆,jboss覆盖了WSService的sun实现,您需要设置类加载以在sun实现之前加载jboss实现。

由于sun的实现在rt.jar中,您需要使用认可的库。

在@WebDevice注释中添加endpointInterface,如果您在使用getPort方法时没有提到endpoint interface,请给出完全限定的端口名。

HelloWorld.java
中,您应该更改
name=“endpointInterface”
@WebService
注释到
name=“HelloRemote”

BeanWSClient.java
getPort(stringendpointuri)
方法中,替换

return service.getPort(HelloRemote.class);  

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