我正在使用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)
向InvalidInputException
添加@XmlRootEntity
并不能解决问题。
如果这不是通过web服务报告故障的推荐方法,那么有没有更好的方法?我的异常是否应该继承自RuntimeException
,并依赖于错误处理的传输(即,一切都将最终包装在SOAPException中)?我希望是像Spring-WS的SoapFaultAnnotationExceptionResolver
这样的东西。JAX-WS是否提供了类似的功能?
发布于 2010-01-14 14:22:25
你有没有尝试用@WebFault
注释你的异常?另外,您是否实现了getFaultInfo()
编辑:我意识到我的答案可能还不够详细。正如在this thread中所提醒的(例如):
JAX-WS2.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节故障中详细介绍了这一点。您的异常是否符合此要求?你能把代码贴出来吗?
行动是对的。根据规范2.1,第3.7节服务特定异常,不需要使用@WebFault
注释,JAX-WS可以为与第2.5节中描述的模式不匹配的异常动态生成包装器bean(只需为您希望出现在错误中的信息提供一个getter )。对于与2.5节中描述的模式匹配的异常(即具有getFaultInfo
方法和@WebFault
注释的异常),在将异常映射到XML Schema时,FaultBean用作JAXB的输入。
因此,上面建议的解决方案(与2.5节中描述的模式匹配)只是一种变通方法。包装器bean的生成应该只适用于其他异常。我不知道为什么这里会失败。
发布于 2010-01-14 17:10:48
这是对上面答案的补充。我最终将其作为我的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,这可能就是失败的原因。
这是一个不错的解决方法,但它不能解释问题中的错误。
https://stackoverflow.com/questions/2064447
复制