Проверка схемы на стороне сервера с помощью JAX-WS

У меня есть служба без контейнера JAX-WS (опубликованная через Endpoint.publish() прямо из метода main()). Я хочу, чтобы моя служба проверяла входные сообщения. Я пробовал следующую аннотацию: @SchemaValidation(handler=MyErrorHandler.class) и реализовал соответствующий класс. Когда я запускаю службу, я получаю следующее:

Exception in thread "main" javax.xml.ws.WebServiceException: 
Annotation @com.sun.xml.internal.ws.developer.SchemaValidation(outbound=true,
inbound=true, handler=class mypackage.MyErrorHandler) is not recognizable, 
atleast one constructor of class 
com.sun.xml.internal.ws.developer.SchemaValidationFeature 
should be marked with @FeatureConstructor

Я нашел несколько решений в Интернете все они подразумевают использование контейнера WebLogic. Я не могу использовать контейнер в моем случае, мне нужен встроенный сервис. Могу ли я по-прежнему использовать проверку схемы?


person no id    schedule 04.02.2013    source источник


Ответы (2)


Аннотация @SchemaValidation не определена в спецификации JAX-WS, но проверка остается открытой. Это означает, что вам нужно нечто большее, чем просто классы в jdk.

Пока вы можете добавить несколько jar-файлов в свой путь к классам, вы можете довольно легко настроить это с помощью метро (которое также включено в WebLogic. Вот почему вы найдете решения, которые используют WebLogic в качестве контейнера). Чтобы быть более точным, вам нужно добавить две банки в ваш путь к классам. я бы предложил

  1. загрузите самую последнюю версию Metro.
  2. Разархивируйте его куда-нибудь.
  3. Добавьте jaxb-api.jar и jaxws-api.jar в путь к классам. Вы можете сделать это, например, поместив их в JAVA_HOME/lib/endorsed или вручную добавив их в свой проект. Это во многом зависит от IDE или того, что вы используете.

Как только вы это сделаете, ваш MyErrorHandler должен работать, даже если он развернут через Endpoint.publish(). По крайней мере, у меня есть эта установка локально, и она компилируется и работает.

Если вы не можете изменить свой путь к классам и вам нужна проверка, вам придется проверить запрос вручную с помощью JAXB.

person joergl    schedule 04.02.2013
comment
Вероятно, вы имели в виду jaxws-rt.jar. В любом случае, я просто поместил все JAR-файлы (кроме JavaDoc) в путь к классам проекта, и теперь мой обработчик проверки работает нормально. Спасибо! - person no id; 06.02.2013
comment
Хм, я пытался это проверить, но почему-то не могу заставить обработчик не работать, хотя я удалил все зависимости от этих банок, а также удалил их из JAVA_HOME/lib/endorsed. Они должны быть закэшированы где-то, чего я не могу найти прямо сейчас... Повторю попытку на другом компьютере. В любом случае, я рад, что это решение для вас :) - person joergl; 06.02.2013

Старый вопрос, но я решил проблему, используя правильный пакет и минимальную конфигурацию, а также используя только предоставляемые услуги от WebLogic. Я столкнулся с той же проблемой, что и вы.

Просто убедитесь, что вы используете правильный тип Java, как я описал здесь.

Поскольку я планирую расширить механизм отслеживания, я также реализовал собственный обработчик ошибок.

Веб-служба с настраиваемым обработчиком проверки

import com.sun.xml.ws.developer.SchemaValidation;

@Stateless
@WebService(portName="ValidatedService")
@SchemaValidation(handler=MyValidator.class)
public class ValidatedService {

    public ValidatedResponse operation(@WebParam(name = "ValidatedRequest") ValidatedRequest request) {

        /* do business logic */

        return response;
    }
}

Пользовательский обработчик для регистрации и сохранения ошибок в базе данных

public class MyValidator extends ValidationErrorHandler{

    private static java.util.logging.Logger log = LoggingHelper.getServerLogger();

    @Override
    public void warning(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    private void handleException(SAXParseException e) throws SAXException {
        log.log(Level.SEVERE, "Validation error", e);
        // Record in database for tracking etc
        throw e;
    }
}
person Evandro Pomatti    schedule 21.01.2015