java - JAX-WS 在客户端检索抛出的自定义异常

标签 java web-services tomcat 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:errorMessage):

<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>

但是当我尝试在客户端捕获错误时,errorCode 和 errorMessage 的值为空。

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 中的值已填充。这些值(value)观并没有一直跟随到客户。 从 wsdl 文件创建客户端代码时会生成两个异常类:ThrowExceptionToClient 和 ThrowExceptionToClient_Exception。 我是在创建自定义异常类时做错了什么,还是客户端中的 catch 子句无效?

编辑:MessageWrapper 类:

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 axis。问题变得更加清楚了。我在上面的代码中没有显示的是 ThrowExceptionToClient 有以下注释 @WebFault(faultBean = "exceptionLayer.MessageWrapper") 它使用类 MessageWrapper 中的成员变量而不是 getter 和二传手。从而返回一个methodNotFoundException getErrorMessage()。删除注释 @WebFault(faultBean = "exceptionLayer.MessageWrapper") 解决了这个问题。

关于java - JAX-WS 在客户端检索抛出的自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066412/

相关文章:

Java/Android Studio - 协变返回类型 - "subclass"中的方法与 "baseclass": attempting to use incompatible return type 中的方法冲突

java - 使用 jboss 使用 web 服务

java - Sonatype nexus 下载的 jars 位置

java - 类 ClassFormatError :Absent-Code-attribute-in-method-that-is-not-native

java - 使用 Thread.stop(Throwable) 强制将运行时异常抛出到线程中是否存在危险?

java.lang.NoClassDefFoundError : com/sun/mail/util/MailLogger while trying to send e-mail from JAX-WS

java - 如何将数组发送到数组列表?

java - Apache CXF : multiple endpoints or multiple CXFServlet servlets?

java - Rest Api 中的两个类可以有相同的路径吗?

java - 如何监控 session 值?