2014-10-03 3 views
0

Я не уверен, что правильный метод должен был бы исключать исключения из асинхронных методов в GWT. У меня есть dataservice, который подключается к базе данных, запрашивает информацию и затем возвращает ее клиенту. Но я не понимаю принципиально, что делать, когда происходит проверенное исключение и как его обрабатывать.Каков правильный способ пропускать исключения в асинхронных методах в GWT?

В настоящее время у меня есть что-то вроде этого

public int addAssembler(int assemblerID, String name, boolean active) { 
     Connection con = connect(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     try { 
      String query = "INSERT INTO assemblers (name, hidden) VALUES ('" + name + "'," + active + ")"; 
      ps = con.prepareStatement(query); 
      System.out.println("addAssembler " + ps.toString()); 
      ps.executeUpdate(query); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      close(rs, ps, con); 
     } 
     return 1; 
    } 

и называется здесь

public void onClick(ClickEvent event) { 
       Ioma.dataservice.addAssembler(0, name.getText(), !isActive.getValue(), new AsyncCallback<Integer>() { 
        @Override 
        public void onFailure(Throwable caught) { 
         Window.alert("Failed to add assembler! Please check error log" + caught.toString()); 
        } 

       @Override 
       public void onSuccess(Integer result) { 
        Window.alert("Assembler " + name.getText() + " added"); 
       } 
      }); 

Я понимаю, что SQLException поймана в моей Try/уловом, но я хотел бы метод потерпеть неудачу и я хотел бы передать его обратно в Failure, как мне это сделать? Я попробовал

public int addAssembler(parameters) throws SQLException {} 

но он дает мне исходный код не найдена ошибка для SQLException. Я также не уверен, что это правильный способ сделать это? Есть ли способ лучше?

ответ

2

Просьба ознакомиться с документацией this section.

Вы не можете выбросить SQLException, потому что клиент не знает, что это такое. Что вы можете сделать, это определить свой тип исключений (в клиенте или общий пакет):

public class DatabaseException extends Exception implements IsSerializable 
{ 
    private static final long serialVersionUID = -7935074533073743071L; 

    public DatabaseException() 
    { 
     super(); 
    } 

    public DatabaseException(String message) 
    { 
     super(message); 
    } 

    public DatabaseException(Exception e) 
    { 
     super(e); 
    } 
} 

Затем объявим его в вашем методе обслуживания:

public interface MyService extends RemoteService { 
    int addAssembler(int assemblerID, String name, boolean active) throws DatabaseException; 
} 

Тогда вы можете бросить его на сервере сторона:

public int addAssembler(int assemblerID, String name, boolean active) throws DatabaseException { 
    Connection con = connect(); 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    try { 
     String query = "INSERT INTO assemblers (name, hidden) VALUES ('" + name + "'," + active + ")"; 
     ps = con.prepareStatement(query); 
     System.out.println("addAssembler " + ps.toString()); 
     ps.executeUpdate(query); 
    } catch (SQLException e) { 
     throw new DatabaseException(e); // <----- THIS IS IMPORTANT 
    } finally { 
     close(rs, ps, con); 
    } 
    return 1; 
} 

на клиенте метод onFailure(Throwable caught) затем будет называться, и вы можете сделать следующее:

@Override 
public void onFailure(Throwable caught) 
{ 
    if(caught instanceof DatabaseException) 
     Window.alert(caught.getLocalizedMessage()); 
} 
+1

BTW: Вам не нужно делать это для всех 'Exception', только те, которые не [эмулируются уже] (http://www.gwtproject.org/doc/latest/RefJreEmulation.html). – Baz

+2

И не забудьте зарегистрировать его на сервере. И подумайте о том, что вы действительно отправляете полную трассировку стека и сообщение исключения SQL для клиента - если возникла проблема с SQL-инъекцией или связью, вы действительно хотите отправить «эй», вот как вы сломать меня!' сообщение браузеру? –

Смежные вопросы