代码之家  ›  专栏  ›  技术社区  ›  waxwing

JAX-WS-将异常映射到故障

  •  26
  • waxwing  · 技术社区  · 15 年前

    我正在使用JAXWS公开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 不能解决问题。

    如果这不是通过Web服务报告故障的推荐方法,那么有更好的方法吗?我的例外会从 RuntimeException 并且依赖传输来进行错误处理(即,所有内容最终都将包装在一个soapexception中)?我希望能有点像春天的W' SoapFaultAnnotationExceptionResolver . 对于JAX-WS有类似的东西吗?

    2 回复  |  直到 15 年前
        1
  •  26
  •   Pascal Thivent    15 年前

    你是否试图用 @WebFault ?另外,你是否实施 getFaultInfo() ?

    编辑: 我知道我的答案可能不够详细。正如在 this thread (例如):

    JAX-WS 2.0规范要求 用注释的异常 @网络故障 必须有两个构造函数 以及一种方法【获取故障信息的getter】:

    WrapperException(String message, FaultBean faultInfo)
    WrapperException(String message, FaultBean faultInfo, Throwable cause)
    FaultBean getFaultInfo()
    

    这个 WrapperException 被替换 异常的名称,以及 FaultBean 替换为类 实现故障bean的名称。 故障bean是一个Java bean。 包含故障信息 并由Web服务客户端使用 知道故障的原因。

    这在JAX-WS规范的第2.5节故障中有详细说明。你的例外符合这一点吗?你能把密码贴出来吗?


    手术是对的。根据规范2.1第3.7节服务特定例外,无需使用 @ WebFault 注释,JAX-WS可以动态地为与第2.5节中描述的模式不匹配的异常生成包装bean(只需提供一个getter来获取您希望在错误中出现的信息)。对于符合第2.5节所述模式的异常(即具有 getFaultInfo 方法及 @ WebFault 注释)。 豆科植物 在将异常映射到XML架构时用作JAXB的输入。

    因此,上面建议的解决方案(与第2.5节中描述的模式相匹配)只是一种解决方案。包装bean的生成应该只适用于其他异常。我不知道为什么会失败。

        2
  •  16
  •   waxwing    15 年前

    对上述答案的补充。最后,我将此作为我的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;
        }
    }
    

    FaultBean 只是一个简单的POJO,目前完全没有数据。现在,根据JAX-WS规范(参见3.7特定于服务的异常),它符合用@webfault注释的异常的要求,因此它不会为它创建包装bean,这可能是失败的原因。

    这是一个不错的解决方法,但不能解释问题中的错误。