JAX-WS - Исключения Карты к отказам

Я использую WS JAX для представления WebService. Некоторые операции этого сервиса могут генерировать исключения. Не внутренние исключения сервера, а скорее исключения, которые зависят от входных параметров операционного вызова.

Если я определяю, что моя операция выдает пользовательское Исключение, как так:

@WebService
@SOAPBinding(style = Style.RPC, use = Use.LITERAL)
public class MyServiceEndpointImpl implements MyServiceEndpoint {

    @WebMethod
    public void throwsException throws InvalidInputException;
}

Я заканчиваю со следующим stacktrace при запуске приложения:

 com.sun.xml.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.mypackage.ws.services.jaxws.InvalidInputExceptionBean is not found. Have you run APT to generate them?
    at com.sun.xml.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:285)
    at com.sun.xml.ws.model.RuntimeModeler.processExceptions(RuntimeModeler.java:1006)
    at com.sun.xml.ws.model.RuntimeModeler.processRpcMethod(RuntimeModeler.java:969)
    at com.sun.xml.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:546)
    at com.sun.xml.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:370)
    at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:256)
    at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:322)
    at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:188)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:467)
    at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:333)
    at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:45)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121)

Добавление @XmlRootEntity к InvalidInputException не решает проблему.

Если это не рекомендуемый способ сообщить об отказах по веб-сервисам, то является там лучшим путем? Если мои исключения наследовались RuntimeException и полагайтесь на транспорт для обработки ошибок (т.е. все закончится обернутое в SOAPException)? Я надеялся на что-то как WS Spring SoapFaultAnnotationExceptionResolver. Действительно ли там что-то подобно вообще доступное для JAX-WS?

27
задан waxwing 14 January 2010 в 13:45
поделиться

2 ответа

Вы пытались аннотировать ваше исключение с @WebFault ? Кроме того, вы реализуете GetFaultinfo () ?

Редактировать: Я понимаю, что мой ответ был, возможно, недостаточно подробно. Как напоминают в этой теме (например):

Спецификация Jax-WS 2.0 что исключение, аннотированное с @WebFault Должен иметь два конструктора и один метод [Getter для получения информации о неисправностях]:

 WRAPPEREXCECTION (STRING MESSIC, FITATBEAN FATATINFO)
Wrapperexception (Струнное сообщение, Faiffuban FaiTINFO, Моремого причина)
Fiflbean GetFaultinfo ()
 

Wrapperexception заменяется название исключения и ShiftBean заменяется классом Имя, которое реализует фасоль неисправностей. Фасоль неисправностей - это фасоль Java, который содержит информацию о неисправности и используется клиентом веб-службы знать причину ошибки.

Это подробно описано в разделе 2.5 Ошибка спецификации JAX-WS. Ваше исключение соответствует этому? Можете ли вы опубликовать код?


OP правильный. Согласно спецификации 2.1, раздел 3.7 Специфическое исключение, не требуется аннотацию @WebFault , JAX-WS может генерировать бобы обертки динамическими для исключения, которые не соответствуют шаблону, описанному в разделе 2.5. Просто предоставьте Getter для получения информации, которую вы хотите присутствовать в вине). Для исключения, которые соответствуют шаблону, описанному в разделе 2.5 (то есть исключения, которые имеют метод GetFaultinfo и @WebFault Annotation), ShiftBean используется в качестве входа в JAXB При сопоставлении исключения с схемой XML.

Так что решение, предложенное выше (сопоставление шаблона, описанного в разделе 2.5), является только обходным путем. Генерация бобов обертки должна просто работать для других исключений. И я не знаю, почему это не удается здесь.

27
ответ дан 28 November 2019 в 05:19
поделиться

Дополнение к ответу выше. Я оказался с этим как моим реализацией InvalidInPutException:

@WebFault(faultBean = "com.mypackage.ws.exception.FaultBean")
public class InvalidInputException extends Exception {

    private static final long serialVersionUID = 1L;

    private FaultBean faultBean;

    public InvalidInputException() {
        super();
    }

    public InvalidInputException(String message, FaultBean faultBean, Throwable cause) {
        super(message, cause);
        this.faultBean = faultBean;
    }

    public InvalidInputException(String message, FaultBean faultBean) {
        super(message);
        this.faultBean = faultBean;
    }

    public FaultBean getFaultInfo() {
        return faultBean;
    }
}

и ShiftBean - просто простой Pojo с данными вообще никаких данных. Теперь, согласно спецификации JAX-WS (см. 3.7 Service Special Exception), он соответствует тому, что требуется для исключения, аннотированного с @Webfault, поэтому он не создаст для него боб обертывания, что, вероятно, является то, что было неспособным.

Это достойный обходной путь, но он не объясняет ошибку в этом вопросе.

17
ответ дан 28 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: