代码之家  ›  专栏  ›  技术社区  ›  Mnemonics

JAX-WS在客户端检索引发的自定义异常

  •  0
  • Mnemonics  · 技术社区  · 7 年前

    我有一个从客户端(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 Services Explorer使用中的方法时,我确实得到了正确的错误代码(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的值为null。

    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\u 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;
    }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Mnemonics    7 年前

    我重写了web服务,以使用Jax ws作为框架,而不是apache axis。问题变得更加清楚了。在上面的代码中,我没有显示ThroweExceptionToClient具有以下注释 @WebFault(faultBean = "exceptionLayer.MessageWrapper") 它使用类MessageWrapper中的成员变量,而不是getter和setter。从而返回methodNotFoundException getErrorMessage()。删除批注 @WebFault(faultBean=“exceptionLayer.MessageWrapper”) 解决了问题。