我正在使用JAX-WS的Java优先方法开发Web服务。我正在努力弄清楚如何向Web服务客户端提供详细的错误信息。理想情况下,当有验证错误时,我想抛出下面的类的实例:
public class ValidationException extends Exception {
private Errors errors;
public ValidationException(Errors errors) {
this.errors = errors;
}
public Errors getErrors() {
this.errors;
}
}
Errors
对象(类似于Spring's Errors interface)封装:
ValidationException
,例如
public class MyEndpoint {
public void doSomething(ValidateableInput input) throws ValidationException {
// implementation omitted
}
}
客户端使用wsimport生成的代码访问服务。但是,此代码不会抛出我的ValidationException
类的实例,而是抛出由wsimport
生成的异常类的实例(此类也被命名为ValidationException
但是在不同的包中)。客户端的ValidationException
不包含Errors
对象,因此有关错误原因的详细信息将丢失。
在SOAP / JAX-WS的上下文中,服务抛出的ValidationException
实例必须转换为a SOAP fault。我已阅读this article有关JAX-WS中的错误demonstrates how to use a Fault Bean以封装有关异常的更多详细信息。但是,Fault Bean似乎仅限于:
一个Java类,它有一个no-arg构造函数,一个消息String字段,以及一个getter和setter。这将成为您肥皂的载体:故障细节元素。
所以它只提供一个String来封装有关错误原因的信息。
总结:是否可以在为JAX-WS服务生成的客户端代码中提供详细的错误信息
答案 0 :(得分:2)
问题的答案是是,可以在WebFault中提供详细的错误信息。
E.g。
@WebFault(faultBean = "com.myexample.Errors")
public class ValidationException extends Exception {
private static final long serialVersionUID = 1L;
private Errors errors;
public ValidationException() {
super();
}
public ValidationException(String message, Errors errors, Throwable cause) {
super(message, cause);
this.errors = errors;
}
public ValidationException(String message, Errors errors) {
super(message);
this.errors = errors;
}
public Errors getErrors() {
return errors;
}
}
Errors类可以定义为,
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Errors", propOrder = {
"message"
})
public class Errors {
@XmlElement(required = true)
protected String message;
public String getMessage() {
return message;
}
public void setMessage(String value) {
this.message = value;
}
}
与消息变量一样,错误类可以包含任意数量的变量,这些变量可以保存值,并且可以在客户端访问。
答案 1 :(得分:0)
在Web服务中,如果抛出异常,它将转到封装在SoapFault中的客户端,但所有异常都在其中。
在您的具体示例中,如何在WSDL中声明ValidationException?它有什么领域?我认为你的问题是你的ValidationException calss中没有setErrors()方法。默认情况下,JAXB会创建类的描述(如果没有使用JAXB注释),只需将getter-setter对添加为字段。