dpHibernate: serializerFactory не инициализируется Spring -> NullPointerException при доступе к сервису - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь запустить dpHibernate 2.0 RC6 на Apache Tomcat 7.0.12 с BlazeDS 4.0.0.14931, Spring 3.0.5 и Spring-BlazeDS-Integration 1.5.0.M2

При следующей конфигурации сервер запускается нормально, но как только я хочу получить доступ к службе или RDSDispatchServlet через FlashBuilder4 DCD, я получаю исключение NullPointerException. Похоже, что serializerFactory неправильно введен в dpHibernate HibernateUtil. Я что-то упустил в конфигурации в remoting-config.xml?

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
          version="2.5">

   <display-name>Server</display-name>
   <description>Server Side based on BlazeDS, Spring and Hibernate</description>
   <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <listener>
    <listener-class>flex.messaging.HttpFlexSession</listener-class>
   </listener>

   <!-- begin SPRING INTEGRATION -->
   <servlet>
     <servlet-name>springMessageBroker</servlet-name>
     <servlet-class>
       org.springframework.web.servlet.DispatcherServlet
     </servlet-class>
     <!-- <init-param> -->
     <!-- <param-name>contextConfigLocation</param-name> -->
     <!-- <param-value></param-value> Do not use if using ContextLoaderListener (would load app context twice -> Error) -->
     <!-- </init-param> -->
     <init-param>
        <param-name>services.configuration.file</param-name>
        <param-value>/WEB-INF/flex/services-config.xml</param-value>
     </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMessageBroker</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
  </servlet-mapping>
  <!-- end SPRING INTEGRATION -->

  <!-- begin rds -->
  <servlet>
    <servlet-name>RDSDispatchServlet</servlet-name>
    <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
    <init-param>
        <param-name>useAppserverSecurity</param-name>
        <param-value>false</param-value>
    </init-param>        
    <init-param>
        <param-name>messageBrokerId</param-name>
        <param-value>_messageBroker</param-value>
    </init-param>        
    <load-on-startup>10</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>RDSDispatchServlet</servlet-name>
    <url-pattern>/CFIDE/main/ide.cfm</url-pattern>
  </servlet-mapping>
  <!-- end rds -->

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>

  <filter>
    <filter-name>dpHibernateSessionFilter</filter-name>
    <filter-class>org.dphibernate.filters.HibernateSessionServletFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>dpHibernateSessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

applicationContext.xml (файл конфигурации Spring Servlet по умолчанию)

<beans  xmlns="http://www.springframework.org/schema/beans"
    xmlns:flex="http://www.springframework.org/schema/flex"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/flex
        http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <import resource="flexContext.xml" />
    <import resource="dataAccessContext.xml" />
    <import resource="dpHibernateContext.xml"/>

    <!-- Enable Spring Transaction Manager with Annotations -->
    <tx:annotation-driven />

    <context:annotation-config />

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations" value="/WEB-INF/server.properties" /></bean>

    <context:component-scan base-package="com.mycompany.myproject.*" />
</beans>

flexContext.xml (определения служб, доступных для flex)

<beans  xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:flex="http://www.springframework.org/schema/flex"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/flex      
        http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">


    <flex:message-destination id="chat"/>

    <flex:message-broker services-config-path="/WEB-INF/flex/services-config.xml">
            <flex:remoting-service default-adapter-id="dpHibernateRemotingAdapter" default-channels="my-amf,my-secure-amf" />
            <flex:message-service default-channels="my-streaming-amf,my-polling-amf"/>
    </flex:message-broker>
</beans>

fpHibernateContext.xml (настройка dpHibernate)

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:flex="http://www.springframework.org/schema/flex"  
      xmlns:security="http://www.springframework.org/schema/security"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:context="http://www.springframework.org/schema/context" 
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:util="http://www.springframework.org/schema/util"
      xsi:schemaLocation="http://www.springframework.org/schema/aop
                          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                          http://www.springframework.org/schema/beans
                          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                          http://www.springframework.org/schema/context
                          http://www.springframework.org/schema/context/spring-context-3.0.xsd
                          http://www.springframework.org/schema/flex 
                          http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
                          http://www.springframework.org/schema/security 
                          http://www.springframework.org/schema/security/spring-security-3.0.xsd        
                          http://www.springframework.org/schema/tx 
                          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
                          http://www.springframework.org/schema/util 
                          http://www.springframework.org/schema/util/spring-util-3.0.xsd
                          ">
  <!-- Defines the remoting adapter, which intercepts inbound & outbound messages, and routes them thruogh dpHibernate -->
  <bean id="dpHibernateRemotingAdapter"
    class="org.springframework.flex.core.ManageableComponentFactoryBean">
    <constructor-arg value="org.dphibernate.adapters.RemotingAdapter" />
    <property name="properties">        
      <value>
      {"dpHibernate" :
        {
          "serializerFactory" : "org.dphibernate.serialization.SpringContextSerializerFactory"
        }
      }
      </value>
    </property>
  </bean>
  <bean id="dpHibernateMessagingAdapter"
    class="org.springframework.flex.core.ManageableComponentFactoryBean"> 
    <constructor-arg value="org.dphibernate.adapters.MessagingAdapter" /> 
  </bean> 

  <bean id="dataAccessService" class="org.dphibernate.services.SpringLazyLoadService" autowire="constructor">
    <flex:remoting-destination />
  </bean>

  <!-- Required -->
  <bean id="hibernateSessionFilter" class="org.dphibernate.filters.SpringHibernateSessionServletFilter" />

  <!-- The cache is used to prevent serializing the same object many times during serialization.  Required -->
  <bean id="dpHibernateCache" 
    class="org.dphibernate.serialization.DPHibernateCache" scope="prototype" />

  <!-- The main serializer. Converts outbound POJO's to ASObjects with dpHibernate proxies for lazy loading.  Required -->
  <bean id="dpHibernateSerializer"
    class="org.dphibernate.serialization.HibernateSerializer" scope="prototype">
    <property name="pageSize" value="10"/>
  </bean>
  <bean id="dpHibernateDeserializer" class="org.dphibernate.serialization.HibernateDeserializer" scope="prototype" />
  <!--  Handles entity updates (CRUD).  Required if using entity persistence. -->
  <bean id="objectChangeUpdater" 
    class="org.dphibernate.persistence.state.AuthenticatedObjectChangeUpdater" 
    scope="prototype">
    <property name="preProcessors" ref="dpHibernatePreProcessors" />
    <property name="postProcessors" ref="dpHibernatePostProcessors" />
  </bean>   
</beans>

remoting-config.xml (импортировано в services-config.xml)

<service id="remoting-service" 
         class="flex.messaging.services.RemotingService"
         messageTypes="flex.messaging.messages.RemotingMessage">

  <adapters>
    <adapter-definition id="hibernate-object" class="org.dphibernate.adapters.RemotingAdapter" default="true">
      <properties>
        <hibernate>
          <sessionFactory>
            <class>org.dphibernate.utils.HibernateUtil</class>
            <getCurrentSessionMethod>getCurrentSession</getCurrentSessionMethod>    
          </sessionFactory>
        </hibernate>
      </properties>
    </adapter-definition>
    <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter"/>
  </adapters>

  <default-channels>
    <channel ref="my-amf"/>
  </default-channels>
</service>

NullPointerException (при доступе к сервису или доступе через RDS через FB4 DCD)

startInternal INFO: запуск сервлета Двигатель: Apache Tomcat / 7.0.12 11.04.2011 18:34:19 org.apache.catalina.core.ApplicationContext log INFO: Инициализация корня Spring WebApplicationContext 1027 [Тема-2] ИНФОРМАЦИЯ org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final 1066 [Thread-2] INFO org.hibernate.cfg.Environment - Hibernate 3.6.2.Final 1074 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.Environment - hibernate.properties не найден 1085 [Тема-2] ИНФО org.hibernate.cfg.Environment - Имя поставщика байт-кода: javassist 1116 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.Environment - использование JDK 1.4 java.sql. Обработка временных меток 2146 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.Configuration - Валидатор гибернации не найден: игнорируя 2182 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Невозможно найти org.hibernate.search.event.FullTextIndexEventListener на пути к классам. Поиск в спящем режиме не включено. 2194 [Тема-2] ИНФОРМАЦИЯ org.hibernate.connection.ConnectionProviderFactory - Инициализация поставщика соединений: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider 2658 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.SettingsFactory - База данных -> имя: MySQL версия: 5.0.51a-24 + lenny5-log Major: 5 несовершеннолетний: 0 2658 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.SettingsFactory - Водитель -> имя: MySQL-AB Драйвер JDBC версия: mysql-connector-java-5.1.15 ( Редакция: $ {bzr.revision-id}) Major: 5 несовершеннолетний: 1 2861 [Тема-2] INFO org.hibernate.dialect.Dialect - Использование говор: org.hibernate.dialect.MySQLInnoDBDialect 2981 [Тема-2] ИНФОРМАЦИЯ org.hibernate.transaction.TransactionFactoryFactory - Стратегия транзакции: org.springframework.orm.hibernate3.SpringTransactionFactory 2991 [Тема-2] ИНФОРМАЦИЯ org.hibernate.transaction.TransactionManagerLookupFactory - TransactionManagerLookup не настроен (в среде JTA использование чтение-запись или транзакция кеш второго уровня не рекомендуется) 2991 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.SettingsFactory - Автоматическая промывка во время beforeCompletion (): отключено 2991 [Тема-2] ИНФО org.hibernate.cfg.SettingsFactory - Автоматическое закрытие сессии в конце транзакция: отключена 2991 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.SettingsFactory - Размер пакета JDBC: 20 2991 [Тема-2] ИНФОРМАЦИЯ org.hibernate.cfg.SettingsFactory - Пакетные обновления JDBC для версионных данных: отключено 2998 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Прокручиваемые наборы результатов: включено 2998 [Тема-2] ИНФО org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys (): включено 2998 [Тема-2] ИНФО org.hibernate.cfg.SettingsFactory - Режим разъединения соединения: авто 3003 [Тема-2] ИНФО org.hibernate.cfg.SettingsFactory - Максимальная глубина извлечения внешнего соединения: 2 3003 [Тема-2] ИНФО org.hibernate.cfg.SettingsFactory -Размер пакетной выборки по умолчанию: 1 3003 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Создать SQL с комментариями: отключено 3003 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Упорядочить обновления SQL по первичному ключу: отключено3003 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Заказать вставки SQL для пакетирования: отключено 3003 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Переводчик запросов: org.hibernate.hql.ast.ASTQueryTranslatorFactory 3023[Thread-2] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Использование ASTQueryTranslatorFactory 3023 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Запросы замены языка: {} 3023 [Thread-2] INFO org.hiber.cfg.SettingsFactory - строгое соответствие JPA-QL: отключено 3023 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - кэш второго уровня: включено 3023 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - кэш запросов:отключено 3029 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Фабрика области кэша: org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge 3074 [Thread-2] ИНФОРМАЦИЯ org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge - Поставщик кэша: org.hibernate.cache.HashtableCacheProvider 3084 [Thread-2] INFO org.hibernate.izeF.FFминимальные значения: отключено 3084 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - записи структурированного кэша второго уровня: отключено 3131 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - вывод всех SQL в стандартный вывод 3138 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Статистика: отключено 3138 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Откат синтетического идентификатора удаленного объекта: отключено 3138 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Режим объекта по умолчанию: pojo 3138 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Проверка именованного запроса: включено 3138 [Thread-2] INFO org.hibernate.cfg.SettingsFactory - Проверка Nullability в ядре (должно бытьотключено при включенной проверке бина): включено 3239 [Thread-2] INFO org.hibernate.impl.SessionFactoryImpl - создание фабрики сеансов 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типа [blob] переопределяет предыдущее: org.hibernate.type.BlobType@17f7be7b 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типа [java.sql.Blob] переопределяет предыдущее: org.hibernate.type.BlobType@17f7be7b 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типа [materialized_clob] переопределяет предыдущее:org.hibernate.type.MaterializedClobType@9fa8988 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типов [wrapper_materialized_blob] переопределяет предыдущее: org.hibernate.type.WrappedMaterializedBlobType@6f0. INFO2.hibernate.type.BasicTypeRegistry - регистрация типа [clob] переопределяет предыдущее: org.hibernate.type.ClobType@21044daf 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типа [java.sql.Clob] переопределяет предыдущее:org.hibernate.type.ClobType@21044daf 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типа [characters_clob] переопределяет предыдущее: org.hibernate.type.PrimitiveCharacterArrayClobType@21882d18 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistrywrapper_characters_clob] переопределяет предыдущее: org.hibernate.type.CharacterArrayClobType@734893da 3282 [Thread-2] INFO org.hibernate.type.BasicTypeRegistry - регистрация типа [materialized_blob] переопределяет предыдущее: org.hibernate.type-Blog.79.T32] ИНФОРМАЦИЯ org.hibernate.impl.SessionFactoryObjectFactory - Не привязана фабрика к JNDI, имя JNDI не настроено 11.04.2011 18:34:36 org.apache.catalina.core.ApplicationContext log INFO: Инициализация Spring FrameworkServlet «springMessageBroker»11.04.2011 18:34:36 org.apache.coyote.AbstractProtocolHandler start INFO: Запуск ProtocolHandler ["http-bio-8080"] 11.04.2011 18:34:36 org.apache.coyote.AbstractProtocolHandler start INFO: Запуск ProtocolHandler ["ajp-bio-8009"] 11.04.2011 18:34:36 org.apache.catalina.startup.Catalina start INFO: запуск сервера в 21332 мс 11.04.2011 18:49:02 org.apache.catalina.core.StandardWrapperValveвызовите SCHWERWIEGEND: Servlet.service () для сервлета [RDSDispatchServlet] в контексте с путем [/ myJavaServer] выбросило исключение java.lang.NullPointerException в org.dphibernate.utils. * HibernateUtil.actSession(Неизвестный источник) в org.dphibernate.filters.HibernateSessionServletFilter.getSessionFactory (Неизвестный источник) в org.dphibernate.filters.AbstractHibernateSessionServletFilter.doFilter (неизвестный источник) в org.apache.catalina.core.) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:210) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:240) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValche.cat) org..authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:462) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:164) в org.apache.catalina.valves.ErrorReportValveinport (RevalValve.in).) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:118) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:395) в org.apache.coyote.orp11.http11процесс (Http11Processor.java:250) в org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process (Http11Protocol.java:188) в org.apache.coyote.http11.Http11Protocol $ Httttp11protocol (Http11166)в org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.java:302) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) в java.lang.Thread.run (Thread.java:662) * 10391040 * org.dphibernate.utils.HibernateUtil (фрагмент)

private static ISerializerFactory serializerFactory; // should be injected by Spring

public static SessionFactory getSessionFactory() throws HibernateException
{
    return serializerFactory.getSessionFactory(); // but is null on this call?
}

1 Ответ

0 голосов
/ 12 апреля 2011

Файл remotingConfig.xml не нужен и, по-видимому, является причиной ваших проблем.

Как правило, в конфигурации Spring класс HibernateUtil, который вы там показали, не используется (SpringContextSerializerFactory возвращает SessionFactory, чтобы убедиться, что вы получаете правильный результат из сеанса Spring)

Однако похоже, что ваш файл remotingConfig.xml перезаписывает настройки по умолчанию, заставляя его использовать старую HibernateUtil подход, который бросает ваш NPE.

...