4

场景:创建一些Web服务作为@Stateless bean,将其打包为ejb jar。结果 - 无法访问 wsdl 文件。

目标:我想将@WebServices 用作@Stateless 会话,使用ejb jar 打包和可访问的wsdl 文件形式的web。

网络服务:

@Stateless
@WebService(serviceName = "ws.isp.SecurityService", wsdlLocation = "META-INF/wsdl/SecurityService.wsdl")
public class SecurityService{
    @EJB
    private Kerberos factory;

    @EJB
    private UsersServiceBean uService;

    public SecurityService() {
    }

    @WebMethod
    @WebResult(name = "SimpleResponse")
    public SimpleResponse LogOut(
            @WebParam(name = "sessionUUID", targetNamespace = "https://secure.co.ua/ws/")
            String sessionUUID
    ) {
        SimpleResponse resp = new SimpleResponse();
        try{
        factory.removeSession(sessionUUID);

        resp.setError(WSErrorCodes.SUCCESS);
        }catch (Exception e){
            e.printStackTrace();
            resp.setError(WSErrorCodes.UNRELOSVED_ERROR);
        }
        return resp;
    }

    @WebMethod
    public MySession logIn(
            @WebParam(name = "username", targetNamespace = "https://secure.co.ua/ws/")
            String username,
            @WebParam(name = "password", targetNamespace = "https://secure.co.ua/ws/")
            String password){
        MySession result = new MySession();
        try {
            UserSession us = factory.creatSession(uService.getUser(username, password).getId());
            result.setSessionID(us.getSessionUUID().toString());
            result.setError(WSErrorCodes.SUCCESS);
        } catch (NullPointerException e){
            e.printStackTrace();
            result.setError(WSErrorCodes.UNRELOSVED_USER);
        } catch (Exception e){
            e.printStackTrace();
            result.setError(WSErrorCodes.UNRELOSVED_ERROR);
        }
        return result;
    }

}

在这种情况下,我得到

wsdl 请求无效 http://192.168.44.48:8181/ws.isp.SecurityService/SecurityService

当我尝试访问 wsdl 并且如果不使用 wsdlLocation 的描述,我会得到空白页。

Web 服务,因为它自我运作良好。

Q1:在 ejb jar 中将 Web 服务的 wsdl 文件位置描述为无状态的规则是什么?

Q2:maven打包时是否可以生成wsdl文件?

Q3:如何为我们有@Stateless和@EJB等注解的Web服务生成wsdl文件(目前我只能通过注释这些注解来生成它)

环境:mave 2、ejb 3.1、glassfish v3、jax-ws 2.x

谢谢!

4

2 回答 2

2

Q1。在 ejb jar 中将 Web 服务的 wsdl 文件位置描述为无状态的规则是什么。

如果通过 wsdllocation 属性提供,Metro 似乎使用类加载器读取 WSDL,这使得META-INF/wsdlEJB JAR 成为放置 WSDL 的不错选择。我使用以下 EJB 进行了测试:

@Stateless
@WebService(wsdlLocation = "META-INF/wsdl/HelloService.wsdl")
public class HelloService {
    public String hello(String name) {
        return "Hello, " + name + "!";
    }
}

WSDL 位于src/main/resources/META-INF/wsdl/我的 EJB maven 项目中。

访问http://localhost:8080/HelloServiceService/HelloService?wsdl 会显示我的WSDL(而不是动态生成的)。

所以问题是,你试过http://192.168.44.48:8181/ws.isp.SecurityService/SecurityService?wsdl吗?

Q2。是否可以在 maven 打包期间生成 wsdl 文件?

jaxws-maven-plugin:wsgen目标可以做到这一点(见参数genWsdl),但我必须承认我现在完全迷失了。

当使用 Java-first 方法时,您要么让 JAX-WS 运行时在部署时动态生成 W​​SDL,要么提供静态版本并使用wsdlLocation. 但是,生成 WSDL 并使用wsdlLocationIMO 并没有多大意义。重点是什么?wsgen的文档以某种方式证实了这一点:

默认情况下,wsgen 不会生成 WSDL 文件。此标志是可选的,将导致 wsgen 生成 WSDL 文件,通常仅用于开发人员在部署端点之前查看 WSDL。

Q3。如何为我们有 @Stateless 和 @EJB 等注释的 Web 服务生成 wsdl 文件(目前我只能通过注释这些注释来生成它)

我不明白这个问题,也不明白你为什么要生成 WDSL(见上文)。

于 2010-05-13T21:04:48.690 回答
0

问题出在页面检查器中。所以当我访问 http://192.168.44.48:8181/ws.isp.SecurityService/SecurityService?wsdl时,我在网络检查器中得到了空白页。

对不起假的。

于 2010-05-23T10:18:01.797 回答