【问题标题】:@WebServices as @Stateless session bean in ejb jar@WebServices 作为 ejb jar 中的 @Stateless 会话 bean
【发布时间】:2011-02-19 00:20:56
【问题描述】:

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

目标:我想使用 @WebServices 作为 @Stateless 会话,使用 ejb jar 打包和可访问的 wsdl 文件表单。

网络服务:

@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

谢谢!

【问题讨论】:

    标签: maven-2 wsdl jax-ws java-ee-6 ejb-3.1


    【解决方案1】:

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

    对不起,假货。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      第二季度。是否可以在 maven 打包期间生成 wsdl 文件?

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

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多