Я пишу код консоли, используя интеграцию GWT и Spring. Я последовал за GWT-учебником и прочитал некоторые форумы о том, как использовать Spring Qith GWT.Spring GWT integration
Я нахожусь в точке, где вызов RPC возвращает значение null, и я не могу понять, почему. Поскольку английский не мой родной язык, и я довольно новичок в этом, я просто собираюсь поставить здесь свой код, чтобы узнать, может ли кто-нибудь помочь мне с ним.
Услуги:
@RemoteServiceRelativePath("GestionUserService")
public interface GestionUserService extends RemoteService {
Collection<Usuario> dameTablaUsuarios(String entidad);
}
Асинхронный:
public interface GestionUserServiceAsync {
void dameTablaUsuarios(String entidad,AsyncCallback<Collection<Usuario>> callback);
}
Impl:
@SuppressWarnings("serial")
@Service("GestionUserService")
public class GestionUsersConsultImpl extends RemoteServiceServlet implements GestionUserService {
@Autowired
UserConsoleDBUtil utilDB;
Logger logger = Logger.getLogger(GestionUsersConsultImpl.class);
@SuppressWarnings("unchecked")
public Collection<Usuario> dameTablaUsuarios(String entidad) {
GWT.log("Log");
logger.info("He llegado al IMPL dameTablaUsuarios.======================="+entidad);
logger.info("UtilDB "+utilDB.toString());
return utilDB.getDao().getUsuarios(entidad);
}
}
* gwt.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='userConsole'>
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User' />
<!-- Compilar solamente para Firefox -->
<!--<set-property name="user.agent" value="gecko1_8"></set-property> -->
<inherits name='com.google.gwt.user.theme.standard.Standard' />
<inherits name="com.google.gwt.i18n.I18N" />
<!-- Specify the app entry point class. -->
<entry-point class='com.santander.bam.comun.userconsole.client.GestionUsers' />
<!-- English language, independent of country -->
<extend-property name="locale" values="es_ES" />
<extend-property name="locale" values="en_US" />
<extend-property name="locale" values="de_DE" />
<!-- Specify the application specific style sheet. -->
<stylesheet src='UserConsole.css' />
<!-- Specify the paths for translatable code -->
<source path='client' />
<source path='client/services' />
<source path='db/bean' />
</module>
applicationContext.xml:
<beans>
<!-- Activates scanning of @Autowired -->
<context:annotation-config />
<context:component-scan base-package="com.santander.bam.comun.userconsole" />
<!-- FIN Agregado de la consola gwt-spring -->
<import resource="config.xml" />
<util:constant id="VARCHAR" static-field="java.sql.Types.VARCHAR" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
<bean id="GestionUserService" class="com.santander.bam.comun.userconsole.server.GestionUsersConsultImpl"></bean>
<bean id="utilDB" class="com.santander.bam.comun.userconsole.db.UserConsoleDBUtil">
<property name="dao" ref="UserConsoleDAO" />
<property name="transactionManager" ref="transactionManager"/>
</bean>
</beans>
config.xml
<beans >
<bean id="UserConsoleDAO" class="com.santander.bam.comun.userconsole.db.UserConsoleDAO">
<property name="dataSource" ref="myDataSource" />
<!-- Definicion de consultas -->
<property name="sqlUsuarios"
value=" SELECT DISTINCT (IDUSER) IDUser,
NOMBRE Nombre,
IDPerfil IDPerfil,
FECHAALTA FechaAlta,
FECHABAM FechaBAM,
FECHACON FechaConsola
FROM
A_APAMA.USERS
WHERE
EMPRESA=?" />
<property name="sqlUsuarios2"
value=" SELECT DISTINCT (IDUSER) IDUser
FROM
A_APAMA.USERS
WHERE
EMPRESA=?" />
</bean>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver" />
<property name="url"
value="jdbc:db2://udisapma.isban.dev.corp:60090/udisapma" />
<property name="username" value="a_apama" />
<property name="password" value="********" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource" />
</bean>
</beans>
И, наконец, моя web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- Loads and makes available the context defined in springconfig-service.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springGwtRemoteServiceServlet</servlet-name>
<servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>gestionUsersConsultImpl</servlet-name>
<servlet-class>com.santander.bam.comun.userconsole.server.GestionUsersConsultImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springGwtRemoteServiceServlet</servlet-name>
<url-pattern>/springGwtServices/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>gestionUsersConsultImpl</servlet-name>
<url-pattern>/userConsole/GestionUserService</url-pattern>
</servlet-mapping>
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>GestionUsers.html</welcome-file>
</welcome-file-list>
<!-- Paginas de error -->
<error-page>
<error-code>401</error-code>
<location>/accessDeny.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/serverError.html</location>
</error-page>
</web-app>
В моем главном классе у меня есть это:
AsyncCallback<Collection<Usuario>> getUserID2 = new AsyncCallback<Collection<Usuario>>() {
// Failure: muestra error
public void onFailure(Throwable caught) {
whatever;
}
// Succes: obtener usuario
public void onSuccess(Collection<Usuario> Users) {
Whatever;
}
};
gestionUservc.dameTablaUsuarios("3293", getUserID2);
Edit: В случае его полезным здесь ошибка:
com.google.gwt.user.server.rpc.UnexpectedException: Сервисный метод «общественный абстрактный java.util.Collection com.santander.bam.comun. userconsole.client.GestionUserService.dameTablaUsuarios (java.lang.String) 'выкинул неожиданное исключение: java.lang.NullPointerException в com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure (RPC.java:378) at com .google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:581) в com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:207) в com.google.gwt .user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:243) в com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) в javax.servlet.h ttp.HttpServlet.service (HttpServlet.java:637) в javax.servlet.http.HttpServlet.service (HttpServlet.java:717) в org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:487) в org .mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java:362) в org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216) в org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler .java: 181) в org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:729) в org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:405) в org.mortbay.jetty. handler.HandlerWrapper.handle (HandlerWrapper.java:152) в org.mortbay.jetty.handler.RequestLogHandler.handle (RequestLogHandler.java:49) в org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) на org.mortbay.jetty.Server.handle (Server.java:324) на org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:505) на org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConne ction.java:843) на org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:647) на org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:211) на org.mortbay.jetty.HttpConnection.handle (HttpConnection.java:380) в org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:395) в org.mortbay.thread.QueuedThreadPool $ PoolThread.run (QueuedThreadPool.java:488) Вызвано: java.lang.NullPointerException: null на com.santander.bam.comun.userconsole.server.GestionUsersConsultImpl.dameTablaUsuarios (GestionUsersConsultImpl.java:31) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl .java: 39) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Method.invoke (Method.java:597) в com.google.gwt.user.server.rpc. RPC.invokeAndEncodeResponse (RPC.java:562) в com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:207) в com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:243) в com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) в javax.servlet.http.HttpServlet.service (HttpServlet.java:637) в javax.servlet .http.HttpServlet.service (HttpServlet.java:717) в org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:487) в org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java:362) в org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216) в org.mortbay. jetty.servlet.SessionHandler.handle (SessionHandler.java:181) в org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:729) в org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java: 405) в org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) в org.mortbay.jetty.handler.RequestLogHandler.handle (RequestLogHandler.java:49) в org.mortbay.jetty.handler.HandlerWrapper .handle (HandlerWrapper.java:152) в org.mortbay.jetty.Server.handle (Server.java:324) в org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:505) в org.mortbay.jetty. HttpConnection $ RequestHandler.content (HttpConnection.java:843) в org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:647) в org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:211) в org.mortb ay.jetty.HttpConnection.handle (HttpConnection.java:380) в org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:395) в org.mortbay.thread.QueuedThreadPool $ PoolThread.run (QueuedThreadPool.java: 488)
Edit 2: А вот то, что мой журнал говорит:
2013-02-25 16: 20: 02424 INFO [org.springframework.web.context.ContextLoader] - Root WebApplicationContext: инициализация началась 2013-02-25 16: 20: 02,453 INFO [org.springframework.web.context.support.XmlWebApplicationContext] - Обновление корневого WebApplicationContext: дата запуска [Mon Feb 25 16:20:02 CET 2013]; root из контекстной иерархии 2013-02-25 16: 20: 02,496 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Загрузка определений компонентов XML из ресурса ServletContext [/WEB-INF/applicationContext.xml] 2013- 02-25 16: 20: 02,696 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Загрузка определений компонентов XML из ресурса ServletContext [/WEB-INF/config.xml] 2013-02-25 16:20: 02,724 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - переопределение определения bean-компонента для bean-транзакцииManager: замена [Generic bean: class [org.springframework.jdbc.datasource.DataSourceTransactionManager]; Объем =; абстрактные = ложь; lazyInit = ложь; autowireMode = 0; dependencyCheck = 0; autowireCandidate = TRUE; первичные = ложь; factoryBeanName = NULL; factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = NULL; определенный в ресурсе ServletContext [/WEB-INF/config.xml]] с помощью [Generic bean: class [org.springframework.jdbc.datasource.DataSourceTransactionManager]; Объем =; абстрактные = ложь; lazyInit = ложь; autowireMode = 0; dependencyCheck = 0; autowireCandidate = TRUE; первичные = ложь; factoryBeanName = NULL; factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = NULL; определенный в ресурсе ServletContext [/WEB-INF/applicationContext.xml]] 2013-02-25 16: 20: 02,724 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - переопределение определения bean-компонента для bean-компонента GestionUserService: заменяя [Generic bean: class [com.santander.bam.comun.userconsole.server.GestionUsersConsultImpl]; Объем = одноэлементный; абстрактные = ложь; lazyInit = ложь; autowireMode = 0; dependencyCheck = 0; autowireCandidate = TRUE; первичные = ложь; factoryBeanName = NULL; factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = NULL; определен в файле [D: \ Workspace \ USER_CONSOLE \ target \ UserConsole \ WEB-INF \ classes \ com \ santander \ bam \ comun \ userconsole \ server \ GestionUsersConsultImpl.class]] с помощью [Generic bean: class [com.santander.bam .comun.userconsole.server.GestionUsersConsultImpl]; Объем =; абстрактные = ложь; lazyInit = ложь; autowireMode = 0; dependencyCheck = 0; autowireCandidate = TRUE; первичные = ложь; factoryBeanName = NULL; factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = NULL; определенный в ресурсе ServletContext [/WEB-INF/applicationContext.xml]] 2013-02-25 16: 20: 02,803 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Предварительные экземпляры синглетов в org.springframework. [email protected]: определение beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation .internalCommonAnnotationProcessor, GestionUserService, UserConsoleDAO, myDataSource, TransactionManager, УАКСНАК, utilDB]; корень из заводской иерархии 2013-02-25 16: 20: 02,890 INFO [org.springframework.web.context.ContextLoader] - Корневой WebApplicationContext: инициализация завершена в 466 мс 2013-02-25 16: 20: 10,020 INFO [com .santander.bam.comun.userconsole.server.GestionUsersConsultImpl] - Он llegado al IMPL dameTablaUsuarios. ======================= 3293
Спасибо за быстрый ответ. Я добавил эту строку, чтобы убедиться, что мой DAO был нулевым, если я выйду из этой строки, я все равно получаю ту же ошибку, поэтому я думаю, что мой объект utilDB имеет значение null в этот момент, но я не понимаю, почему. – Borja
Можете ли вы поставить точку останова и посмотреть, что там происходит? –
Я бы сделал это, если мог, но я не могу заставить работать режим отладки, возможно, я что-то делаю, но я запускаю приложение в режиме отладки с точкой останова, когда я собираюсь сделать асинхронный вызов, и он, похоже, не запускает отладку, это то, что я получаю на консоли: Прослушивание транспорта dt_socket по адресу: 8000, поэтому он остается там, ожидая, когда я что-то сделаю, но я не знаю, что. – Borja