Проблемы с возвратом в объект Openshift JSON с инфраструктурой Spring

У меня есть приложение на Java с Tomcat 7 (JBoss EWS 2.0), PostgreSQL 9.2 и Spring framework. Он состоит из веб-службы REST, которая получает запросы от клиента Android и возвращает объекты JSON.

Я успешно развернул предварительно скомпилированные Java-приложения (ROOT.war) в каталоге Openshift «~/app-root/runtime/repo/webapps/» с помощью ssh и создал базу данных в Openshift.

Мое приложение отлично работает локально, но не работает, когда я запускаю его в Openshift: http://jbossews-roteiro.rhcloud.com/usuarios/1. В журнале появляется сообщение об исключении типа "Не удалось установить соединение JDBC: вложенным исключением является java.sql.Exception".

java.lang.Exception: Se ha producido un error al ejecutar el método UsuarioServiceImpl$verUsuario(1): Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver found for jdbc:postgresql://$OPENSHIFT_POSTGRESQL_DB_HOST:$OPENSHIFT_POSTGRESQL_DB_PORT/jbossews
    at com.roteiro.services.usuario.UsuarioServiceImpl.verUsuario(UsuarioServiceImpl.java:115)
    at com.roteiro.controller.RoteiroController.verUsuarioAction(RoteiroController.java:193)
    at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

Я читал некоторые связанные сообщения и думаю, что проблема заключается в конфигурации PostgreSQL, включенной в Spring, или в файле «~/app-root/repo/repo/.openshift/config/context.xml». Я также проверяю, включен ли коннектор PostgreSQL в папку с библиотекой.

Содержание ROOT.war:

/img/*
/META-INF/MANIFEST.MF
/WEB-INF/classes/*
/WEB-INF/lib/*
/WEB-INF/applicationContext.xml
/WEB-INF/applicationDataSource.xml
/WEB-INF/applicationEntityBean.xml
/WEB-INF/web.xml

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 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" id="WebApp_ID" version="2.5">
  <display-name>jbossews</display-name>
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

/WEB-INF/applicationContext.xml (весна):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="......................................................................">

    <context:component-scan base-package="com.roteiro.controller" />

    <mvc:annotation-driven />

    <mvc:resources mapping="/img/**" location="/img/" />

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>

    <import resource="applicationDatasource.xml" />
    <import resource="applicationEntityBean.xml" />

</beans>

/WEB-INF/applicationDatasource.xml (весна):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

    <!-- development database -->
    <!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/jbossews" />
        <property name="username" value="adminvhhvpiq" />
        <property name="password" value="______________" />
    </bean> -->

    <!-- production database -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://$OPENSHIFT_POSTGRESQL_DB_HOST:$OPENSHIFT_POSTGRESQL_DB_PORT/$OPENSHIFT_APP_NAME" />
        <property name="username" value="$OPENSHIFT_POSTGRESQL_DB_USERNAME" />
        <property name="password" value="$OPENSHIFT_POSTGRESQL_DB_PASSWORD" />
    </bean>

</beans>

context.xml:

<Resource name="jdbc/PostgreSQLDS"
          url="jdbc:postgresql://${OPENSHIFT_POSTGRESQL_DB_HOST}:${OPENSHIFT_POSTGRESQL_DB_PORT}/${OPENSHIFT_APP_NAME}"
          driverClassName="org.postgresql.Driver"
          username="${OPENSHIFT_POSTGRESQL_DB_USERNAME}"
          password="${OPENSHIFT_POSTGRESQL_DB_PASSWORD}"
          auth="Container"
          type="javax.sql.DataSource"
          maxActive="20"
          maxIdle="5"
          maxWait="10000"/>

person burus86    schedule 11.01.2014    source источник
comment
Одинаков ли пользователь/пароль для БД в Dev и prod?   -  person Merlin    schedule 11.01.2014
comment
да. Это тот же логин и пароль.   -  person burus86    schedule 11.01.2014
comment
В следующий раз, пожалуйста, публикуйте трассировку стека, а не ссылку на его изображение. Трассировка стека говорит вам, что не найдено подходящего драйвера, что является распространенной ошибкой.   -  person Brian Roach    schedule 11.01.2014


Ответы (1)


Я думаю, вы пытаетесь получить имя пользователя/пароль из файла свойств или из какого-либо другого места. вы ставите username как "${OPENSHIFT_POSTGRESQL_DB_USERNAME}". удалите " из значения или введите имя пользователя/пароль прямо здесь.

person Neeraj    schedule 11.01.2014
comment
Наконец, я решил свою проблему, отредактировав файл конфигурации Spring /WEB-INF/applicationDatasource.xml следующим образом: ‹?xml version=1.0 encoding=UTF-8 ?› ‹!DOCTYPE beans PUBLIC --//SPRING/ /DTD BEAN//EN springframework.org/dtd/spring-beans.dtd› ‹beans› ‹!-- производственная база данных --› ‹bean id=dataSource class=org.springframework.jndi.JndiObjectFactoryBean› ‹property name=jndiName value=java:comp/env/jdbc/PostgreSQLDS/› ‹/bean › ‹/beans› jdbc/PostgreSQLDS уже определен в моем файле сервера Openshift context.xml. - person burus86; 12.01.2014