JAX-WS - 映射故障的例外

时间:2010-01-14 13:45:39

标签: java web-services jax-ws

我正在使用JAX WS来公开WebService。此服务的某些操作可能会生成异常。不是内部服务器异常,而是依赖于操作调用的输入参数的异常。

如果我指定我的操作会抛出自定义异常,如下所示:

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

    @WebMethod
    public void throwsException throws InvalidInputException;
}

运行应用程序时,我最终得到以下堆栈跟踪:

 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中)?我希望像Spring-WS'SoapFaultAnnotationExceptionResolver这样的东西。是否有类似JAX-WS的类似内容?

2 个答案:

答案 0 :(得分:27)

您是否尝试使用@WebFault注释您的例外?另外,您是否实施了getFaultInfo()

编辑:我意识到我的答案可能不够详细。正如this thread中提醒的那样(例如):

  

JAX-WS 2.0规范要求   带有注释的异常   @WebFault必须有两个构造函数   和一个方法[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故障中有详细说明。你的例外符合这个吗?你可以发布代码吗?


OP是对的。根据规范2.1,3.7服务特定异常,不需要使用@WebFault注释,JAX-WS可以动态生成包装bean,用于与第2.5节中描述的模式不匹配的异常(只提供一个getter以获取您想要出现在故障中的信息)。对于与第2.5节中描述的模式匹配的异常(即具有getFaultInfo方法和@WebFault注释的异常), FaultBean 在映射异常时用作JAXB的输入到XML Schema。

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

答案 1 :(得分:17)

上述答案的补充。我最终将此作为我的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 Service Specific Exception),它符合使用@WebFault注释的异常的要求,因此它不会为它创建一个包装bean,这可能是失败的原因。 / p>

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