2011-01-05 2 views
2

Я следил за несколькими учебниками и читал официальные документы на code.google.com, но до сих пор не смог решить эту проблему.Проблема с установкой точки входа для службы GWT

Я создаю простой сервис, который проверяет, может ли пользователь быть зарегистрирован.

КЛИЕНТ СТОРОНА:

public interface LoginService extends RemoteService { 

    /** 
    * Checks, if user has valid login. 
    * @param user User's login. 
    * @return True if such a login is in the database. 
    */ 
    boolean isValidUser(User user); 
} 

А вот Асинхронный интерфейс:

public interface LoginServiceAsync { 

    /** 
    * Checks, if user has valid login. 
    * @param user User's login. 
    * @param callback the callback to return True if such a login is in the database. 
    */ 
    void isValidUser(User user, AsyncCallback<Boolean> callback); 
} 

SERVER СТОРОНА:

public class LoginServiceImpl extends RemoteServiceServlet implements LoginService { 

    /** 
    * serial version UID 
    */ 
    private static final long serialVersionUID = 1044980345057997696L; 

    /**{@inheritDoc} */ 
    @Override 
    public boolean isValidUser(User user) { 
     boolean success = true; //TODO change 
    } 

} 

Теперь у меня есть точка входа класса MailClient.java , Прилагаю здесь виджет как:

CustomWidgets.getLoginWidget(this); // access rootPanel and append widget

Теперь мне нужно сделать фактический вызов моей службы, и вот проблема:

LoginServiceAsync loginService = (LoginServiceAsync) GWT.create(LoginService.class); 
       User user = new User(boxName.getText(), boxPassword.getText()); 
       AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() { 

        @Override 
        public void onFailure(Throwable caught) { 
         Window.alert(caught.getMessage()); //TODO change 
        } 

        @Override 
        public void onSuccess(Boolean result) { 
         Window.alert("success"); //TODO change 
        } 
       }; 
       ((ServiceDefTarget) loginService).setServiceEntryPoint(GWT.getModuleBaseURL()+"login"); // dunno what should be here 

Так резюмировать, я не знаю как установить точку входа службы.

Вот мой MailClient.gwt.xml файл:

<module> 
    <inherits name="com.google.gwt.user.User"/> 
    <inherits name="com.google.gwt.user.theme.standard.Standard"/> 
    <entry-point class="com.xorty.mailclient.client.MailClient"/> 
    <servlet path="/login" 
     class="com.xorty.mailclient.server.servlets.LoginServiceImpl" /> 
    <inherits name="com.xorty.mailclient.MailClient"/> 
    <inherits name="com.xorty.mailclient.MailClient"/> 
    <inherits name="com.xorty.mailclient.MailClient"/> 
    <inherits name="com.xorty.mailclient.MailClient"/> 
    <inherits name="com.xorty.mailclient.MailClient"/> 
</module> 

Мой web.xml файл:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <!-- Default page to serve --> 
    <welcome-file-list> 
     <welcome-file>MailClient.html</welcome-file> 
    </welcome-file-list> 
    <servlet> 
     <servlet-name>LoginService</servlet-name> 
     <servlet-class>com.xorty.mailclient.server.servlets.LoginServiceImpl</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>LoginService</servlet-name> 
     <url-pattern>/com.xorty.mailclient.MailClient/login</url-pattern> 
    </servlet-mapping> 
</web-app> 

А вот скриншот структуры проекта: alt text

ответ

2

Вы можете попробовать установить вашу точку входа "login" вместо GWT.getModuleBaseURL() + "login".

Однако я предлагаю немного рефакторинга, потому что вы, кажется, используете старый API GWT. Из GWT 1.6 вам больше не нужно устанавливать EntryPoint для служб при их вызове. Теперь точка входа может быть (и обычно должна быть) установлена ​​один раз для каждой службы с использованием аннотации RemoteServiceRelativePath в интерфейсе службы. Таким образом, в вашем примере LoginService интерфейс должен выглядеть следующим образом:

import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; 

@RemoteServiceRelativePath("login") 
public interface LoginService extends RemoteService { 

    boolean isValidUser(User user); 
} 

После этого изменения вы можете удалить эту строку:

((ServiceDefTarget) loginService).setServiceEntryPoint(GWT.getModuleBaseURL()+"login"); 

Также servlet записи больше не нужны в *.gwt.xml файлов.Вы также можете удалить эту строку:

<servlet path="/login" class="com.xorty.mailclient.server.servlets.LoginServiceImpl" /> 

Ваш web.xml выглядит нормально.

Если вы используете Eclipe с GWT plugin, вы можете создать простой проект GWT и посмотреть на него - сгенерированные проекты содержат пример кода, показывающий, как можно создавать и вызывать службы. Если вы не используете плагин GWT, я настоятельно рекомендую его установить - это вам очень поможет.

+0

Привет, Это действительно работает, как я писал, но только на Tomcat. Я не знаю, что не так с Jetty (он поставляется с этим плагином, который я думаю и использую как контейнер по умолчанию) ... – Xorty

0

Запись службы точка, где сервлет существует на вашем сервере и обычно настраивается в файле web.xml.

Вот довольно старый учебник, но конфигурация сервлета по-прежнему актуальна:

http://lkamal.blogspot.com/2008/09/java-gwt-servlets-web-app-tutorial.html

+0

@pulazoo Я добавил web.xml для публикации, все еще ничего – Xorty

+0

На самом деле он работает при развертывании на Tomcat. Но это не при отладке (Jetty, плагин Google для Eclipse). – Xorty

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