Соедините Liferay 7.x с внешней базой данных Oracle 11g2 - NullPointerException - PullRequest
0 голосов
/ 26 августа 2018

Прежде всего, я попробовал это с Liferay CE portal-7.1.0-GA1 и Liferay portal 7.0 CE GA1. Я объясню детали моего процесса. Мой portal-ext.properties (папка Liferay HOME) выглядит так:

jdbc.ext.driverClassName=oracle.jdbc.OracleDriver
jdbc.ext.url=jdbc:oracle:thin:@localhost:1521:db
jdbc.ext.username=xxx
jdbc.ext.password=xxx

баночки:

- ojdbc14.jar (\liferay-portal-7.0-ce-ga1\tomcat-8.0.32\lib)
- liferay-portal-oracledb-support-1.0 and liferay-portal-oracledb-support-1.0-SNAPSHOT (liferay-portal-7.0-ce-ga1\tomcat-8.0.32\webapps\ROOT\WEB-INF\lib)
- added ext-spring.xml (\modules\DemoService\DemoService-service\build\resources\main\META-INF\spring)

Код для ext-spring.xml

    <?xml version="1.0"?>
    <beans default-destroy-method="destroy" default-init-method="afterPropertiesSet" xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
       <!--bean class="com.liferay.portal.dao.jdbc.spring.DataSourceFactoryBean"
          id="liferayDataSourceFactory">
          <property name="propertyPrefix" value="jdbc.ext." />
          <property name="properties">
              <props>
                  <prop key="custom.jndi.name">extDataSource</prop>
              </props>
          </property>
          </bean-->
       <bean class="com.liferay.portal.dao.jdbc.spring.DataSourceFactoryBean"
          id="liferayDataSourceFactory">
          <property name="propertyPrefix" value="jdbc.ext." />
       </bean>
       <bean
          class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"
          id="liferayDataSource">
          <property name="targetDataSource" ref="liferayDataSourceFactory" />
       </bean>
       <alias alias="extDataSource" name="liferayDataSource" />
    </beans> 

Получение этой ОШИБКИ:

    00:10:31,259 ERROR [http-nio-8080-exec-5][render_portlet_jsp:131] null
    java.lang.NullPointerException
    at com.service.service.CountryLocalServiceUtil.getCountriesCount(CountryLocalServiceUtil.java:207)
    at com.demo.portlet.DemoPortlet.doView(DemoPortlet.java:39)
    at com.liferay.portal.kernel.portlet.LiferayPortlet.doDispatch(LiferayPortlet.java:302)
    at com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.doDispatch(MVCPortlet.java:474)
    at javax.portlet.GenericPortlet.render(GenericPortlet.java:262)
    at com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.render(MVCPortlet.java:294)
    at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:103)
    at com.liferay.portlet.ScriptDataPortletFilter.doFilter(ScriptDataPortletFilter.java:57)
    at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:100)
    at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:64)
    at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:105)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at com.liferay.portal.osgi.web.servlet.context.helper.internal.ServletContextHelperRegistrationImpl$PortletServletWrapper.service(ServletContextHelperRegistrationImpl.java:507)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.eclipse.equinox.http.servlet.internal.registration.EndpointRegistration.service(EndpointRegistration.java:153)
    at org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.liferay.portal.osgi.web.servlet.context.helper.internal.ServletContextHelperRegistrationImpl$RestrictPortletServletRequestFilter.doFilter(ServletContextHelperRegistrationImpl.java:527)
    at org.eclipse.equinox.http.servlet.internal.registration.FilterRegistration.doFilter(FilterRegistration.java:121)
    at org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:45)
    at org.eclipse.equinox.http.servlet.internal.servlet.ResponseStateHandler.processRequest(ResponseStateHandler.java:71) 

Страна - это сущность в service.xml, после создания службы Gradle генерируется CountryLocalServiceUtil. Если вы используете Liferay 7, это простой процесс создания первого приложения.

Это сгенерированный класс, могу дать код:

  • Из портлета я только что вызвал функцию CountryLocalServiceUtil.getCountriesCount()

  • эта функция в CountryLocalServiceUtil:

    public static int getCountriesCount() {
        return getService().getCountriesCount(); 
    }
    
  • Открытое объявление:

    CountryLocalService.java @Transactional(propagation = Propagation.SUPPORTS, 
                                            readOnly = true)
    public int getCountriesCount(); 
    

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Я почти уверен, что ваша проблема не в базе данных, а в том, что объект службы недоступен, поскольку ваша проблема не наступила getCountriesCount(), но getService().

В качестве эксперимента попробуйте не использовать *Используемый класс, но OSGi @Reference для нужной вам службы, это должно исключить базу данных как проблему (по крайней мере, в этом отношении).если вы не можете получить услугу, вы, вероятно, найдете более подробную информацию для устранения неполадок, чем NPE, выбрасываемый в класс * Util.

Например, в вашем компоненте:

@Reference
private volatile CountryLocalService countryLocalService;

примеры по всему источнику Liferay, например: https://github.com/liferay/liferay-portal/blob/180d89ccaa80b86e68402c73a1483cd9e1817311/modules/apps/export-import/export-import-resources-importer/src/main/java/com/liferay/exportimport/resources/importer/internal/util/ImporterFactory.java

0 голосов
/ 26 августа 2018

Вы используете Liferay 7.x CE. Обратите внимание, что Liferay Community Edition (CE) поддерживает только базы данных с открытым исходным кодом, например, нет оракула. В сообществе есть дополнение, которое добавляет поддержку Oracle и других коммерческих баз данных, но вы не указываете, что установили его.

Таким образом, кажется, что вы запускаете Liferay из поддерживаемой базы данных и пытаетесь подключиться к Oracle в вашей базе данных "jdbc.ext". Я ожидаю, что это не сработает, так как для этого потребуется сопоставление сервис-билдера с Oracle, хотя они не содержатся в CE.

Вы всегда можете использовать чистый JDBC (например, без компоновщика служб) или попробовать плагин Антонио . В настоящее время я только знаю, что это для 7.0, а не для 7.1 (но я могу ошибаться здесь)

...