JAX-WS 检索客户端抛出的定制异常



我有一个从客户端(JavaFX桌面应用程序)使用的Web服务。为此,我还创建了一个自定义异常类,它将返回定义的消息和错误代码。我尝试使用的方法如下:

public void insertUserDataService(String mailAddress, String userName, String name, String lastName, String password) throws ThrowExceptionToClient {
try {
String hashPassword = BCrypt.hashpw(password, BCrypt.gensalt());
User user = new User(mailAddress, userName, name, lastName, hashPassword);
controller.insertUser(user, cdba);
} catch (ClassNotFoundException | SQLException e  ) {
if(e instanceof SQLException) { 
SQLException sqlE = (SQLException) e;
throw new ThrowExceptionToClient(sqlE);
}
else {
throw new ThrowExceptionToClient(e);
}
}
}

观察引发的实例,如果异常的类型为 SQLException。自定义类如下所示:

public class ThrowExceptionToClient extends Exception{
/**
* 
*/
private static final long serialVersionUID = 1L;
private MessageWrapper mWrapper;
private String errorCode;
private String errorMessage;
public ThrowExceptionToClient(Exception e) {
if(e instanceof SQLException ) {
if(((SQLException) e).getErrorCode() == 19) {
this.errorCode = "1";
this.errorMessage = "_rae_";
}
}else {
this.errorCode = "99";
this.errorMessage = "_grc_";
}
}   
public String getErrorCode() {
return this.errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMessage() {
return this.errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}

当我尝试通过 Web 服务资源管理器使用该方法时,我确实得到了正确的错误代码 (ns1:errorCode) 和错误消息 (ns1:错误消息):

<detail>
<ns1:fault xmlns:ns1="http://endpointLayer">
<ns1:errorCode>1</ns1:errorCode>
<ns1:errorMessage>_rae_</ns1:errorMessage>
</ns1:fault>
<ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">Mnemonics-MacBook-Air.local</ns2:hostname>
</detail>

但是当我尝试在客户端捕获错误时,错误代码和错误消息的值为空。

try {
endpointService.insertUserDataService(mailTxtField.getText(), userNameTxtField.getText(),
nameTxtField.getText(), lastNameTxtField.getText(),
passwordField.getText());
mailTxtField.clear();
userNameTxtField.clear();
nameTxtField.clear();
lastNameTxtField.clear();
passwordField.clear();
reEnterPasswordField.clear();
} catch (ThrowExceptionToClient_Exception e) {
Alert onThrowExceptionToClientAlert = new Alert(Alert.AlertType.ERROR);
onThrowExceptionToClientAlert.setTitle("Error Dialog");
onThrowExceptionToClientAlert.setHeaderText("Server error detected");
onThrowExceptionToClientAlert.setContentText(e.getFaultInfo().getErrorCode());
onThrowExceptionToClientAlert.showAndWait();
e.printStackTrace();
}
e.getFaultInfo().getErrorCode()

调试时,我可以看到构造函数 ThrowExceptionToClient 中的值已填充。这些值不会一直遵循到客户端。 从 wsdl 文件创建客户端代码时会生成两个异常类:ThrowExceptionToClient 和 ThrowExceptionToClient_Exception。 我在创建自定义异常类时做错了什么,还是客户端中的 catch 子句无效?

编辑:类消息包装器:

public class MessageWrapper {
private String errorMessage;//This variable was used in the client
private String errorCode;
public MessageWrapper(){}
public String getErrorMessage() { return errorMessage; }
public void setErrorMessage(String message) {
this.errorMessage = message;
}
public String getErrorCode() { return errorCode; }
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
}

好吧,我重写了Web服务,以使用Jax-ws作为框架而不是apache轴。问题变得更加明显。我在上面的代码中没有显示的是,ThrowExceptionToClient具有以下注释@WebFault(faultBean = "exceptionLayer.MessageWrapper"),该注释使用类MessageWrapper中的成员变量而不是getters和setter。因此返回一个方法NotFoundException getErrorMessage()。删除注释@WebFault(faultBean = "exceptionLayer.MessageWrapper")解决了问题。

最新更新