我执行动态web服务呼叫使用下面的代码片段:是否可以使用JAX WS Dispatch API处理用户定义的异常?
JAXBContext jc = getJAXBContext(requestClass, responseClass, jaxbContextExtraClasses);
Dispatch<Object> dispatch = service.createDispatch(portQName, jc, Service.Mode.PAYLOAD);
Object requestValue = getRequestValue(requestClass, pOrderedParameters);
JAXBElement<?> request =
new JAXBElement(new QName(serviceQNameStr, pOperationName), requestValue.getClass(), null, requestValue);
Object tmpResponse = dispatch.invoke(request);
调用完美的作品,但如果我添加的服务的用户定义的异常(基本UserException扩展java.lang.Exception的)。
首先,我得到:
javax.xml.bind.UnmarshalException: 意想不到的元素 (URI: “http://schemas.xmlsoap.org/soap/envelope/”, 地方: “故障”)。预期元件是 < {http://my.namespace/} myMethod的>,< {http://my.namespace/} myResponse>
然后我加入UserException_Exception JAX-WS生成的类型到我JAXB上下文,然后得到:
致:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:IllegalAnnotationExceptions 1个计数java.lang.StackTraceElement中没有一个无参数的默认构造函数。在java.lang.StackTraceElement中 在公共java.lang.StackTraceElement中[] java.lang.Throwable.getStackTrace() 在java.lang.Throwable中 在java.lang.Exception的 : 这个问题涉及到以下位置
只有解决方案可我发现是:
- 调度直接SOAP消息,并直接处理SOAP错误(这是Jboss的JAX-WS实现执行使用服务接口的标准,JAX-WS调用的方式) 。这不是我一个可用的解决方案,我想用一个高层次的实现(我亲近SOAP消息越少动我的代码即可)JAXBRIContext.ANNOTATION_READER的
- 使用,这是特定的实现,而不是对我来说可用的解决方案中,为了注释来注释java.lang.Exception的作为@XmlTransient
该服务与用户定义的异常使用公的JAX-WS生成的标准客户机存根和使用工具,例如肥皂UI执行。问题发生在消息的反序列化时,我有在JAXB上下文中没有用户定义的异常伪影,和调用期间当我添加在JAXB上下文那些非JAXB兼容伪影。
我usign的Jboss 4.2.3.GA内的Jboss WS Web服务栈
任何优雅的解决这个问题是值得欢迎的!
谢谢您的回答,是从我SEI生成WSDL,并有在操作异常错误元素: <故障名称=“ActionIdNotFoundExceptionDto”> <肥皂:故障名称=“ActionIdNotFoundExceptionDto”使用=“literal”/> 如果我使用JAX-WS生成的存根执行调用,则会引发ActionIdNotFoundExceptionDto_Exception,其中包含一个ActionIdNotFoundExceptionDto bean。这是我期望使用调度方法的行为。 – snowflake