@WebServices как @Stateless сессионный компонент в ejb jar - PullRequest
4 голосов
/ 13 мая 2010

Сценарий: Создайте некоторый веб-сервис как @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 я получаю пустую страницу.

Веб-сервис сам по себе хорошо работает.

В1: каково правило описания местоположения файла wsdl для веб-сервисов как не сохраняющего состояния в ejb jar.

Q2: возможно ли создать файл wsdl во время maven-упаковки?

Q3: как создать файл wsdl для веб-службы, где у нас есть такие аннотации, как @Stateless и @EJB (в настоящее время я могу сгенерировать их только комментируя эти аннотации)

среда: mave 2, ejb 3.1, glassfish v3, jax-ws 2.x

Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Q1. Каково правило описания расположения файлов wsdl для веб-сервисов как не сохраняющих состояние в ejb jar.

Если предоставляется через атрибут wsdllocation, кажется, что Metro читает WSDL с использованием загрузчика классов, что делает META-INF/wsdl EJB 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 показывает my WSDL (а не динамически генерируемый).

Итак, вопрос в том, пытались ли вы http://192.168.44.48:8181/ws.isp.SecurityService/SecurityService?wsdl?

Q2. Можно ли создать файл wsdl во время maven упаковки?

Цель jaxws-maven-plugin:wsgen может сделать это (см. Параметр genWsdl), но я должен признать, что теперь я полностью потерян.

При использовании подхода Java-first вы либо позволяете среде выполнения JAX-WS динамически генерировать WSDL во время развертывания ~, либо ~ вы предоставляете статическую версию и используете wsdlLocation. Однако генерация WSDL и использование wsdlLocation не имеет особого смысла в IMO. В чем смысл? Документация wsgen как-то подтверждает это:

По умолчанию wsgen не создает файл WSDL. Этот флаг является необязательным и заставляет wsgen генерировать файл WSDL и обычно используется только для того, чтобы разработчик мог посмотреть WSDL до развертывания конечной точки.

Q3. как создать файл wsdl для веб-службы, где у нас есть такие аннотации, как @Stateless и @EJB (в настоящее время я могу сгенерировать их только комментируя эти аннотации)

Я не понимаю вопроса и не понимаю, почему вы хотите сгенерировать WDSL (см. Выше).

0 голосов
/ 23 мая 2010

проблема была в инспекторе битых страниц .. поэтому, когда я перехожу на http://192.168.44.48:8181/ws.isp.SecurityService/SecurityService?wsdl, я получил пустую страницу в веб-инспекторе.

извините за подделку.

...