2017-02-16 2 views
0

Я пытаюсь перенести свое веб-приложение из окон (используя xampp для apache + mysql) в ubuntu (используя контейнер докеров, поэтому у меня есть два контейнера: один с tomcat и еще один с mysql .. они связаны).Подключить веб-приложение к контейнеру tomcat к контейнеру mysql через hibernate

Относительно этого question, я не могу добраться до контейнера sql. Это кеттин от this image.

Контейнер Tomcat создан на официальном коте: изображение 8.0.

Два контейнера связаны через сеть мостового докера, созданную.

Это веб-приложение, которое предоставляет регистрационную службу login +, проверяя присутствие пользователя в db.

Должен сказать, что на окнах все работает хорошо.

Это мой hibernate.cfg файл:

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 

<!-- queste configurazioni sono per il testing in locale --> 
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="connection.url">jdbc:mysql://localhost:49162/AT_DB</property> 

<property name="hibernate.connection.username">root</property> 
<property name="connection.password">lxit</property> 

<!-- JDBC connection pool (use the built-in) --> 
<property name="connection.pool_size">1</property> 
<!-- SQL dialect --> 
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
<!-- Enable Hibernate's automatic session context management --> 
<property name="current_session_context_class">thread</property> 
<!-- Disable the second-level cache --> 
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

<property name="show_sql">false</property> 
<!--<property name="hibernate.hbm2ddl.auto">create-drop</property> se al posto di update metto create, mi cancella il db e lo rifa --> 
<property name="hbm2ddl.auto">update</property> 
     <!-- Entity --> 

<mapping class="com.ATBoscoCastellano.Entity.ClientUser" /> 
<mapping class="com.ATBoscoCastellano.Entity.GenericUser" /> 
<mapping class="com.ATBoscoCastellano.SessionManagement.SessionToken" /> 
<mapping class="com.ATBoscoCastellano.Entity.Post" /> 
<!-- <mapping class="it.boscus.StarFoods.entity.ExampleEmbeddableIDClass2" /> --> 


    </session-factory> 
</hibernate-configuration> 

После того как я вставляю удостоверение, я нажимаю на "Вход"; то есть сервлет с именем «UserSessionServlet», который проверяет, присутствует ли в db пользователь с этими учетными данными; ошибка появляется, когда я нажимаю логин, потому что UserSessionServlet возвращает ошибку http 500.

[редактировать] На TOMCAT контейнере, я увидел, что журналы говорят мне:

16-Feb-2017 09:43:41.498 SEVERE [http-nio-8080-exec-19] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [com.ATBoscoCastellano.servlets.UserSessionServlet] in context with path [/AtApplicazione1] threw exception [Servlet execution threw an 
exception] with root cause 
java.lang.NoClassDefFoundError: Could not initialize class com.ATBoscoCastellano.Util.HibernateUtil.HibernateUtil 
    at com.ATBoscoCastellano.Entity.GenericUser.checkIfUserExistsByEmail(GenericUser.java:198) 
    at com.ATBoscoCastellano.Entity.ClientUser.validateCredentials(ClientUser.java:259) 
    at com.ATBoscoCastellano.servlets.UserSessionServlet.doPost(UserSessionServlet.java:78) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 

Но существуют все эти классы, под неавтоматического/кот/WebApps/AtApplicazione1/WEB-INF/классы/ком/AtBoscoCastellano/некоторые/дорожки.

Должен сказать, что я не модифицировал контейнер tomcat с официального изображения (tomcat: 8.0), поэтому я не могу знать, настроен ли он для спящего режима или нет.

Моя война структурирована следующим образом: три папки (META-INF, WEB-INF, шаблон) и файл (.DS_Store). Из-за моего исключения: java.lang.NoClassDefFoundError: Could not initialize class com.ATBoscoCastellano.Util.HibernateUtil.HibernateUtil, на войне этот класс находится под WEB-INF/classes/com/ATBoscoCastellano/Util/HibernateUtil/... в котором есть HibernateUtil .class и .java.

Когда я CMD Java/JAVAC -version на моем TOMCAT контейнере, его выход:

[email protected]:/opt/tomcat# java -version 
java version "1.8.0_111" 
Java(TM) SE Runtime Environment (build 1.8.0_111-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) 

[email protected]:/opt/tomcat# javac -version 
javac "1.8.0_111" 

[повторно редактировать]: в моих первых запросов, регистрирует Catalina говорит java.net.ConnectException: Connection refused; то, со второго запроса, он говорит мне всегда ту же ошибку.

[EDIT] теперь я использую новый контейнер mysql с именем mysql-phpmyadmin от this. Я связал контейнер tomcat с этим (новым) контейнером; если я укажу, в hibernate.cfg.xml, на localhost:PORT_MYSQL/AT_DB -> соединение отказано в журнале tomcat. Если я указать на mysql-phpmyadmin:PORT/AT_DB, журналы Tomcat говорят:

17-Feb-2017 08:31:25.649 SEVERE [http-apr-8080-exec-2] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [com.ATBoscoCastellano.servlets.UserSessionServlet] in context with path [/AtApplicazione1] threw exception [Servlet execution threw an e 
xception] with root cause 
java.sql.SQLException: null, message from server: "Host '172.17.0.9' is not allowed to connect to this MySQL server" 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:959) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1038) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44) 

Я должен сказать, что в конфигурационном файле в тузде контейнера, есть bind_address 0.0.0.0

+0

Не могли бы вы проверить исключенное исключение из статического блока в 'com.ATBoscoCastellano.Util.HibernateUtil.HibernateUtil'? Это может вызвать NoClassDefFoundError – GauravJ

+0

@GauravJ здесь [http://textuploader.com/d1zpy] есть тело HibernateUtil.java. Я не знаю, почему здесь на контейнерах Tomcat + Mysql это не работает, на WIndows, с Xampp, все работает хорошо. – pier92

+0

Я не могу получить доступ к ссылке. Возможно, что ваши статические инициализаторы терпят неудачу в этой новой комбинации. – GauravJ

ответ

0

Я думаю, у меня есть идея, почему вы получаете это исключение.Вы работаете 2 контейнера,

  1. MySQL контейнер для базы данных
  2. Tomcat контейнер

Конечно, ваше исключение из-за статического исключения переменной инициализации,

public static final SessionFactory sessionFactory = buildSessionFactory(); 

Кроме того, ваш файл свойств имеет мало проблем,

  1. connection.url должно быть hibernate.connection.url
  2. Вы упомянули свое имя mysql как localhost, но оно запущено в другом контейнере. Вы должны изменить его на "MySQL", если вы назвали ваш MySQL контейнер, как "MySQL"

java.net.ConnectException: Connection refused (Connection refused) 
at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
at java.net.Socket.connect(Socket.java:589) 
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:214) 
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:298) 

ясно показывает, что ваш либо

  1. Mysql не стереосистеме и обновите. Проверьте, установив соединение с sql-клиентом, как белка.
  2. Контейнер Tomcat не может подключаться к контейнеру mysql. Проверьте быстрый пинг, делая

    docker exec tomcat ping mysql 
    

Взял меня некоторое время, чтобы развернуть это приложение. Я решил проблему, которую вы задали в этом вопросе. Основная проблема заключалась в том, что mysql недоступен из контейнера tomcat. Кроме того, указанный порт также неверен. Ниже hibernate.cfg.xml,

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 

<!-- queste configurazioni sono per il testing in locale --> 
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="connection.url">jdbc:mysql://mysql:3306/AT_DB</property> 

<property name="hibernate.connection.username">root</property> 
<property name="connection.password">lxit</property> 

....rest of configuration....  

    </session-factory> 
</hibernate-configuration> 

Есть несколько проблем, как следующее,

17-Feb-2017 16:07:53.156 INFO [http-nio-8080-exec-1] org.hibernate.dialect.Dialect.<init> HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect 
17-Feb-2017 16:07:53.776 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: ClientUser 
17-Feb-2017 16:07:53.777 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: ClientUser 
17-Feb-2017 16:07:53.818 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: Post 
17-Feb-2017 16:07:53.819 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: Post 
17-Feb-2017 16:07:53.828 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: SessionToken 
17-Feb-2017 16:07:53.828 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: SessionToken 
17-Feb-2017 16:07:53.830 WARN [http-nio-8080-exec-1] org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl.handleException GenerationTarget encountered exception accepting command : Unable to execut 

Но это из-за чувствительности к регистру юниксовских, который был, вероятно, не существует в случае Windows. Остальные исключения тривиальны для решения. Я выполнил следующие команды докеров,

sudo docker run -ti --rm -p 8888:8080 -p 8009:8009 -v $(pwd):/usr/local/tomcat/webapps/ --name tomcat tomcat:9-jre8 bash 

sudo docker run -d --name mysql -p 49162:3306 -p 49161:80 -p 49160:22 lxitgto/mysql-phpmyadmin:v1 

и остальная часть сетевой команды.

+0

для первого пункта, 1) Итак, почему на окнах работает (только) connection.url? Для второго, 2): мой контейнер sql назван правильно «mysql», но два контейнера не связаны, но принадлежат к одной и той же сети; У меня есть cmd "docker network create --driver = bridge mynet", а затем привязаны два контейнера к mynet. – pier92

+0

Не могли бы вы сначала перенести URL-адрес соединения с localhost на mysql? – GauravJ

+0

Я редактировал hibernate.cfg.xml-файл внутри WEB-INF/classes/path; все равно такая же ошибка, но я не перезапустил мой контейнер tomcat ... у меня есть? Или это безразлично? – pier92

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